作为刚接触 WinForms 的小白,最近摸索了 GDI + 绘图的基础用法,踩了不少坑,也终于搞懂了「怎么画图形」「为什么要绑定 Paint 事件」这些核心问题。这篇文章就从零基础视角,拆解 “用 GDI + 绘制普通矩形和渐变色矩形” 的完整过程,希望能帮到和我一样的新手~

一、先搞懂核心逻辑:为什么要绑定 Paint 事件?

先看这段初始化代码,这是绘图的 “第一步”,也是新手最容易懵的地方:

public FrmMain()
{
    InitializeComponent();

    // 将绘制方法绑定到Paint事件上
    this.Paint += FrmMain_Paint;
}

1. Paint 事件是什么?

  • Paint 不是方法,是 WinForms 窗体 / 控件的重绘事件(属于.NET 框架内置)。
  • 当窗体需要 “重新画自己” 时(比如首次打开、窗口大小改变、被其他窗口遮挡后露出),系统会自动触发这个事件。
  • 简单理解:Paint 事件就是系统给我们的 “绘图通知”—— 它喊一声 “该画画了”,我们写的绘图代码就会执行。

2. 为什么要绑定?

如果不把绘图代码绑定到Paint事件:

  • 绘图代码执行一次就结束,窗体刷新后(比如最小化再恢复),画的图形会消失;
  • 无法响应系统的重绘需求,自定义图形根本没法稳定显示。

this.Paint += FrmMain_Paint; 这句话的意思是:把我们写的FrmMain_Paint绘图方法,绑定到当前窗体的 Paint 事件上。当系统触发重绘时,自动执行这个绘图方法

二、核心绘图代码拆解:画普通矩形 + 渐变色矩形

绑定好事件后,真正的绘图逻辑都在FrmMain_Paint方法里,逐行拆解:

private void FrmMain_Paint(object sender, PaintEventArgs e)
{
    // 1. 获取“画布”:Graphics是GDI+的核心绘图工具
    Graphics graphics = e.Graphics;
    
    // ========== 第一步:画普通红色填充矩形 ==========
    // 定义矩形区域:参数依次是(X坐标, Y坐标, 宽度, 高度)
    Rectangle rectangle = new Rectangle(200,200,300,200);
    // 创建红色画刷(Brush是“填充工具”,负责给图形填色)
    Brush brush = new SolidBrush(Color.Red);
    // 执行填充:用红色画刷,填充定义好的矩形区域
    graphics.FillRectangle(brush, rectangle);

    // ========== 第二步:画渐变色填充矩形 ==========
    // 重新定义一个矩形区域(位置和大小和上面不同)
    rectangle = new Rectangle(300,300,200,200);
    // 创建线性渐变画刷:参数依次是(矩形区域, 起始颜色, 结束颜色, 渐变方向)
    LinearGradientBrush linearGradientBrush = new LinearGradientBrush(
        rectangle, 
        Color.Lime,    // 起始色:亮绿色
        Color.Blue,    // 结束色:蓝色
        LinearGradientMode.BackwardDiagonal // 渐变方向:从右上角到左下角
    );
    // 执行填充:用渐变色画刷填充第二个矩形
    graphics.FillRectangle(linearGradientBrush, rectangle);
}
类 / 对象 通俗理解 核心作用
Graphics 画布 + 画笔的合集 所有绘图操作都靠它执行
Rectangle 定义图形的 “位置和大小” 告诉程序 “要在哪里画、画多大”
Brush 填充用的 “颜料刷” 给图形内部填色
SolidBrush 纯色颜料刷 填单一颜色
LinearGradientBrush 渐变颜料刷 填渐变色

补充:坐标怎么看?

WinForms 的坐标原点(0,0)在窗体左上角

  • X 坐标:向右为正,数值越大越靠右;
  • Y 坐标:向下为正,数值越大越靠下。比如new Rectangle(200,200,300,200),就是从窗体左上角向右 200 像素、向下 200 像素的位置,画一个宽 300 像素、高 200 像素的矩形。

三、完整可运行代码(直接复制就能用)

新手最需要的就是 “能跑起来的代码”,这里给完整的窗体代码,创建 WinForms 项目后直接替换即可:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace GDI_Demo
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            // 绑定Paint事件
            this.Paint += FrmMain_Paint;
        }

        private void FrmMain_Paint(object sender, PaintEventArgs e)
        {
            // 获取绘图画布
            Graphics graphics = e.Graphics;
            // 提高绘图质量(抗锯齿,可选)
            graphics.SmoothingMode = SmoothingMode.AntiAlias;

            // 1. 绘制普通红色矩形
            Rectangle rect1 = new Rectangle(200, 200, 300, 200);
            Brush solidBrush = new SolidBrush(Color.Red);
            graphics.FillRectangle(solidBrush, rect1);

            // 2. 绘制渐变色矩形
            Rectangle rect2 = new Rectangle(300, 300, 200, 200);
            LinearGradientBrush gradientBrush = new LinearGradientBrush(
                rect2, 
                Color.Lime, 
                Color.Blue, 
                LinearGradientMode.BackwardDiagonal
            );
            graphics.FillRectangle(gradientBrush, rect2);

            // 释放资源(好习惯:使用完Brush后手动释放)
            solidBrush.Dispose();
            gradientBrush.Dispose();
        }
    }
}

四、新手避坑指南

  1. 不要手动创建 Graphics 实例:比如new Graphics()是错的!必须用e.Graphics(系统为当前窗体准备的画布),否则画不出东西;
  2. 记得释放 Brush 资源:Brush 属于 GDI + 资源,用完后调用Dispose(),避免内存泄漏;
  3. 绘图代码必须写在 Paint 事件里:如果写在按钮点击等其他地方,窗体刷新后图形会消失;
  4. 渐变方向可选LinearGradientMode还有Horizontal(水平)、Vertical(垂直)等选项,可按需替换。

最后总结

  1. GDI + 绘图的核心是绑定Paint事件,确保图形能随窗体重绘稳定显示;
  2. Graphics是绘图工具,Rectangle定义图形区域,Brush负责填充颜色;
  3. 新手先掌握 “纯色矩形”,再尝试渐变、圆形等复杂图形,循序渐进更易理解。

希望这篇小白视角的笔记能帮到你,有问题欢迎评论区交流~

上一篇文章:C# 上位机开发入门:手把手实现带图标的自定义扩展按钮控件

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐