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

Java彩虹表源码 编程彩虹代码怎么打_Java彩虹表源码

Java彩虹表源码 编程彩虹代码怎么打_System_02

Java彩虹表源码 编程彩虹代码怎么打_Java彩虹表源码_03


软件需求及编码提示:

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

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

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

Java彩虹表源码 编程彩虹代码怎么打_取值_04


 绘制彩虹的核心方法是Graphics对象的FillPie方法,该方法的参数解释如下:通过绘制7个同心的不同颜色扇形,即可绘制出彩虹图案。

FillPie(Brush brush, Rectangle rect, float startAngle, float sweepAngle);
摘要:填充椭圆所定义的扇形区的内部,该椭圆System.Drawing.RectangleF 结构和两条射线指定。
brush:用什么颜色的笔刷绘制该扇形。
rect:它表示定义该扇形区所属的椭圆的边框。
startAngle:起始角度。
sweepAngle:沿startAngle扫过的角度。

 第一个参数brush,7个颜色的取值分别是:Brushes. Red, Brushes.Orange,Brushes.Yellow,Brushes.Green,Brushes.GreenYellow,Brushes.Blue,Brushes.Purple。

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

Java彩虹表源码 编程彩虹代码怎么打_取值_05


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

 为了能将彩虹绘制在窗体中心,在Form_Load事件中获取窗体中心点。

Java彩虹表源码 编程彩虹代码怎么打_Red_06


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

Java彩虹表源码 编程彩虹代码怎么打_System_07


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

代码部分:

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 rainbow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.FillPie(Brushes.Red,  center.X, center.Y, 320,320,180, a);
            g.FillPie(Brushes.Orange, center.X+20, center.Y+20,280,280, 180, a);
            g.FillPie(Brushes.Yellow, center.X + 40, center.Y + 40, 240, 240, 180, a);
            g.FillPie(Brushes.Green, center.X + 60, center.Y + 60, 200, 200, 180, a);
            g.FillPie(Brushes.GreenYellow, center.X + 80, center.Y + 80, 160, 160, 180, a);
            g.FillPie(Brushes.Blue, center.X + 100, center.Y + 100, 120,120, 180, a);
            g.FillPie(Brushes.Purple, center.X + 120, center.Y + 120, 80, 80, 180, a);
        }

        Point center;

        private void Form1_Load(object sender, EventArgs e)
        {
            center = new Point(this.Width/2,this.Height/2);
        }

        public static float a = 0;
        int i = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (a < 180)
            {
                a++;
            }
            else
            {
                a = 0;
            }
            this.Invalidate();
        }
    }
}

运行结果:

Java彩虹表源码 编程彩虹代码怎么打_取值_08


使用了一下视频转gif工具,结果不尽人意