C#/Csharp,通过GDI+知识,在窗体上绘制彩虹

本文档指导如何利用GDI+在Windows Forms中创建一个儿童学习软件的Loading界面,通过绘制7个同心扇形实现彩虹效果。关键步骤包括设置双缓存、事件处理、图形对象操作、彩虹颜色渐变、定时器控制角度变化和图形刷新。
摘要由CSDN通过智能技术生成

简介

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

软件需求及编码提示:
 该软件只需要一个窗体,该窗体标题为:“彩虹绘制—2017XXXXXXX”。请依据你的情况填写你的真实学号。
 设置窗体的双缓存为true,避免绘图是,窗体闪烁。(找到主窗口的DoubleBuffered,把它属性改为true)
 添加Form_Paint事件,在该事件中,获取Graphics对象,对应代码提示如下。(点击主窗体,点击属性,找到它属性中的Paint,双击在这里插入图片描述
在自己弹入的方法体中写下面得代码

 绘制彩虹的核心方法是Graphics对象的FillPie方法,该方法的参数解释如下:通过绘制7个同心的不同颜色扇形,即可绘制出彩虹图案。
在这里先补充一下坐标轴概念,主窗体的左上角的坐标为(0,0),往下则y加,往右则x加。
(这个方法还可以用七个属性定义,也可以用一个矩形概括)
在.NET里面它的源代码为:
FillPie(Brush brush, Rectangle rect, float startAngle, float sweepAngle);
public void FillPie(
Brush brush,
int x,//这个是起始的横坐标
int y,//起始的纵坐标
int width,//边框的横向长度
int height,//边框的纵向长度
int startAngle,
int 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。
//要画这个彩虹其实是画了七个扇形,他们的直径一次增加,达到看上去色彩递变的效果,上面是画每个扇形所用刷子的颜色
 第二个参数,这里简化成了一个矩形,直接就定义了边框。
//这里矩形的定义可能会难到某些同学,我在这里说明一下
Point center =new Point(this.Width/2,this.Height/2);
Rectangle rec = new Rectangle(center.X-160, center.Y-160, 320, 320);
第一个属性是矩形左上角点的横坐标,第二个属性是左上角点的纵坐标
第三个是矩形的宽,第四个属性的矩形的长。
 第三个参数,由于窗体坐标系如下所示:通过上述坐标系图,我们可以知道startAngle应该设置为180。

 第四个参数sweepAngle,由于该值随着时间变化,因此,我们需要在方法外定义一个float类型的 sweepAng变量,在timer中不断增加或减少该值,然后在FillPie方法中,使用该变量。利用扫过角度的不断变化,引起所绘制的图形的变化。注意:timer控件是否启用,以及在Tick事件中,调用this. Invalidate ()或者this. Refresh(),更新画面。
 为了能将彩虹绘制在窗体中心,在Form_Load事件中获取窗体中心点。
//这里也是一个难点,我们彩虹的中心和center并不是一致的,彩虹的中心的我们定义矩形对角线相交的地方,所以为了使彩虹的中心和center一致,我们要让彩虹的中心等于(center.x-rec.width/2,center.x-rec.height/2)
 在GDI+中屏幕坐标系的原点在窗体左上角,根据所获得窗体中心变量center以及,每个扇形的半径,结合下图,可以轻松构造出每个扇形应该绘制在的外界矩形Rectangle,即FillPie的第二个参数rect。7个扇形的半径取值分别是:160,140,120,100,80,60,40。

 为了保证绘制出的彩虹只有180°,请在timer的tick事件中加入判断,当sweepAng大于180°的时候,重新置为0°
//
if (sweepAngle <= 180)
{
sweepAngle++;
}
else
{
sweepAngle = 1;
}
this.Invalidate();//写在Timer里的代码,Timer的具体应用我在IOS拨号中写了。

代码

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_201831053318
{

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Point center;
    public int sweepAngle = 1;
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        center = new Point(this.Width / 2, this.Height / 2);
        Graphics g = e.Graphics;//获得绘图对象
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//抗锯齿,增加绘图平滑度

        SolidBrush RainbowBrush1 = new SolidBrush(Color.Red);
        SolidBrush RainbowBrush2 = new SolidBrush(Color.Orange);
        SolidBrush RainbowBrush3 = new SolidBrush(Color.Yellow);
        SolidBrush RainbowBrush4 = new SolidBrush(Color.Green);
        SolidBrush RainbowBrush5 = new SolidBrush(Color.Yellow);
        SolidBrush RainbowBrush6 = new SolidBrush(Color.Blue);
        SolidBrush RainbowBrush7 = new SolidBrush(Color.Purple);

        Rectangle rectangle1 = new Rectangle(center.X - 160, center.Y - 160, 320, 320);
        Rectangle rectangle2 = new Rectangle(center.X - 140, center.Y - 140, 280, 280);
        Rectangle rectangle3 = new Rectangle(center.X - 120, center.Y - 120, 240, 240);
        Rectangle rectangle4 = new Rectangle(center.X - 100, center.Y - 100, 200, 200);
        Rectangle rectangle5 = new Rectangle(center.X - 80, center.Y - 80, 160, 160);
        Rectangle rectangle6 = new Rectangle(center.X - 60, center.Y - 60, 120, 120);
        Rectangle rectangle7 = new Rectangle(center.X - 40, center.Y - 40, 80, 80);


        g.FillPie(RainbowBrush1, rectangle1, 180, sweepAngle);
        g.FillPie(RainbowBrush2, rectangle2, 180, sweepAngle);
        g.FillPie(RainbowBrush3, rectangle3, 180, sweepAngle);
        g.FillPie(RainbowBrush4, rectangle4, 180, sweepAngle);
        g.FillPie(RainbowBrush5, rectangle5, 180, sweepAngle);
        g.FillPie(RainbowBrush6, rectangle6, 180, sweepAngle);
        g.FillPie(RainbowBrush7, rectangle7, 180, sweepAngle);
        
        

    }
    
    private void Timer1_Tick(object sender, EventArgs e)
    {
        if (sweepAngle <= 180)
        {
            sweepAngle++;
        }
        else
        {
            sweepAngle = 1;
        }
        this.Invalidate();
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值