【小白入门】WinForms 绘图实战:基于 GDI + 绘制自定义图形
本文介绍了WinForms中使用GDI+绘制矩形的基础方法。重点讲解了Paint事件的作用及绑定方式,指出这是确保图形稳定显示的关键。通过示例代码详细拆解了绘制普通红色矩形和渐变色矩形的步骤,包括Graphics画布的使用、Rectangle区域定义和Brush填充工具的应用。文章还提供了完整的可运行代码,并针对新手常见问题给出了避坑指南,如正确获取Graphics对象、资源释放等注意事项。最后强
·
作为刚接触 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();
}
}
}
四、新手避坑指南
- 不要手动创建 Graphics 实例:比如
new Graphics()是错的!必须用e.Graphics(系统为当前窗体准备的画布),否则画不出东西; - 记得释放 Brush 资源:Brush 属于 GDI + 资源,用完后调用
Dispose(),避免内存泄漏; - 绘图代码必须写在 Paint 事件里:如果写在按钮点击等其他地方,窗体刷新后图形会消失;
- 渐变方向可选:
LinearGradientMode还有Horizontal(水平)、Vertical(垂直)等选项,可按需替换。
最后总结
- GDI + 绘图的核心是绑定
Paint事件,确保图形能随窗体重绘稳定显示; Graphics是绘图工具,Rectangle定义图形区域,Brush负责填充颜色;- 新手先掌握 “纯色矩形”,再尝试渐变、圆形等复杂图形,循序渐进更易理解。
希望这篇小白视角的笔记能帮到你,有问题欢迎评论区交流~
更多推荐



所有评论(0)