WinForm窗体——完成一个儿童学习类软件的Loading界面

应用软件的Loading界面是一个软件的重要组成部分。请利用所学的GDI+知识,通过在窗体上绘制彩虹的方式,完成一个儿童学习类软件的Loading界面


要求最后的运行图片如下所示:
WinForm窗体——完成一个儿童学习类软件的Loading界面
WinForm窗体——完成一个儿童学习类软件的Loading界面
WinForm窗体——完成一个儿童学习类软件的Loading界面

一、该软件只需要一个窗体,该窗体标题为:“彩虹绘制—2017XXXXXXX”。请依据你的情况填写你的真实学号。

在窗体属性Text处改窗体的标题
WinForm窗体——完成一个儿童学习类软件的Loading界面

二、设置窗体的双缓存为true,避免绘图是,窗体闪烁。

在窗体属性的DoubleBuffered处改为true
WinForm窗体——完成一个儿童学习类软件的Loading界面

三、添加Form_Paint事件,在该事件中,获取Graphics对象,对应代码提示如下。

双击窗体事件中的Paint事件,在生成的代码中加入以下代码WinForm窗体——完成一个儿童学习类软件的Loading界面

四、绘制彩虹的核心方法是Graphics对象的FillPie方法,该方法的参数解释如下:通过绘制7个同心的不同颜色扇形,即可绘制出彩虹图案。WinForm窗体——完成一个儿童学习类软件的Loading界面

五、第一个参数brush,7个颜色的取值分别是:Brushes. Red, Brushes.Orange,Brushes.Yellow,Brushes.Green,Brushes.GreenYellow,Brushes.Blue,Brushes.Purple。WinForm窗体——完成一个儿童学习类软件的Loading界面

六、第三个参数,由于窗体坐标系如下所示:通过上述坐标系图,我们可以知道startAngle应该设置为180。

WinForm窗体——完成一个儿童学习类软件的Loading界面

七、第四个参数sweepAngle,由于该值随着时间变化,因此,我们需要在方法外定义一个float类型的 sweepAng变量,在timer中不断增加或减少该值,然后在FillPie方法中,使用该变量。利用扫过角度的不断变化,引起所绘制的图形的变化。注意:timer控件是否启用,以及在Tick事件中,调用this. Invalidate ()或者this. Refresh(),更新画面。

WinForm窗体——完成一个儿童学习类软件的Loading界面
WinForm窗体——完成一个儿童学习类软件的Loading界面
WinForm窗体——完成一个儿童学习类软件的Loading界面

八、为了能将彩虹绘制在窗体中心,在Form_Load事件中获取窗体中心点。# 九、在GDI+中屏幕坐标系的原点在窗体左上角,根据所获得窗体中心变量center以及,每个扇形的半径,结合下图,可以轻松构造出每个扇形应该绘制在的外界矩形Rectangle,即FillPie的第二个参数rect。7个扇形的半径取值分别是:160,140,120,100,80,60,40。

WinForm窗体——完成一个儿童学习类软件的Loading界面WinForm窗体——完成一个儿童学习类软件的Loading界面

九、为了保证绘制出的彩虹只有180°,请在timer的tick事件中加入判断,当sweepAng大于180°的时候,重新置为0°

将工具中的Timer工具拉到窗体上,再双击Timer1
WinForm窗体——完成一个儿童学习类软件的Loading界面
WinForm窗体——完成一个儿童学习类软件的Loading界面
在生成的代码中添加如下代码:
WinForm窗体——完成一个儿童学习类软件的Loading界面

十、全部代码


//==============================================================
//  作者:西边柚子
//  时间:$2020/11/24$
//  文件名:$Loading$
//  版本:V1.0.1  
//  说明: 功能是完成一个儿童学习类软件的Loading界面
//  修改者:
//  修改说明: 
//==============================================================

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Loading
{
    public partial class Form_1 : System.Windows.Forms.Form
    {
        public Form_1()
        {
            InitializeComponent();
        }
        Point center;
        float sweepAng = 0;
        float startAngle = 180;
        int r = 40;
        private void Form_1_Load(object sender, EventArgs e)
        {
            center = new Point(this.Width / 2, this.Height / 2);
        }

        private void Form_1_Paint(object sender, PaintEventArgs e)
        {
            //获得绘图对象
            Graphics g = e.Graphics;
            //抗锯齿,增加绘图平滑度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;


            g.FillPie(Brushes.Purple, getrect(160), startAngle, sweepAng);
            g.FillPie(Brushes.Blue, getrect(140), startAngle, sweepAng);
            g.FillPie(Brushes.GreenYellow, getrect(120), startAngle, sweepAng);
            g.FillPie(Brushes.Green, getrect(100), startAngle, sweepAng);
            g.FillPie(Brushes.Yellow, getrect(80), startAngle, sweepAng);
            g.FillPie(Brushes.Orange, getrect(60), startAngle, sweepAng);
            g.FillPie(Brushes.Red,getrect(40), startAngle,sweepAng);
           
        }
        private Rectangle getrect(int r)
        {
            Rectangle rect = new Rectangle();
            rect.Width = r * 2;
            rect.Height = r * 2;
            rect.X = center.X - r;
            rect.Y = center.Y - r;
            return rect;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
            this.Refresh();
            if (sweepAng>180)
            {
                sweepAng = 0;
            }
            sweepAng+=1;
        }
    }
}

上一篇:uniapp简单的接口封装 以及封装 loading 加载动画


下一篇:vue element InfiniteScroll 无限滚动 入坑记录