C#使用GDI+绘制矩形完整指南
C#中利用GDI+绘制矩形主要依赖System.Drawing命名空间。核心在于实例化Graphics对象获取画布,定义Pen钢笔确定边框样式,并调用DrawRectangle方法传入位置与尺寸参数。
核心原理与准备
GDI+(Graphics Device Interface Plus)是.NET Framework中用于二维矢量图形的类库。要绘制几何图形,必须明确三个要素:
- 画布(Graphics):提供绘图表面,通常从控件或位图中获取。
- 画笔(Pen):定义线条的颜色、宽度和样式(如实线、虚线)。
- 矩形定义:由左上角坐标 (x, y) 以及宽度 (width)、高度 (height) 共同决定。
具体操作顺序
第1步:引入必要的命名空间
在使用GDI相关类之前,需确保项目中引用了 System.Drawing。在文件顶部添加:using System.Drawing;
这使你能直接访问 Color、Pen、Graphics 等类型。
第2步:初始化画笔对象(Pen)
绘制矩形的边框需要一个 Pen 实例。你可以指定颜色和线宽。
示例代码如下:
// 创建一个黑色、宽度为2像素的画笔
Pen p = new Pen(Color.Black, 2);
注意:Pen 实现了 IDisposable 接口,负责非托管资源的管理。在实际开发中,建议使用 using 语句或在完成任务后手动调用 p.Dispose() 以避免内存泄漏。
第3步:获取绘图上下文(Graphics)
Graphics 对象代表一个GDI+绘图面。根据应用场景不同,获取方式略有差异:
- 自定义控件绘制:通常在重载控件的
OnPaint(PaintEventArgs e)方法中,直接使用参数e.Graphics。 - 窗体即时绘制:可调用
CreateGraphics()方法获取当前设备上下文的 Graphics 对象。
示例:
Graphics g = CreateGraphics();
风险提示:通过 CreateGraphics()Paint 事件中进行绘制。
第4步:调用 DrawRectangle 方法
使用 Graphics 对象的 DrawRectangle 重载方法执行绘制。基本签名如下:
g.DrawRectangle(p, x, y, width, height);
结合前述步骤,完整的绘制逻辑如下:
Pen p = new Pen(Color.Black, 2);
Graphics g = CreateGraphics();
// 在坐标 (200, 200) 处绘制宽100高100的矩形
g.DrawRectangle(p, 200, 200, 100, 100);
// 释放资源
g.Dispose();
p.Dispose();
上述代码将在界面坐标系的 (200, 200) 点开始,向右延伸100像素,向下延伸100像素,绘制出一个正方形边框。
常见场景:在 WinForm 控件上绘制
为了让矩形显示更稳定,推荐在 Panel 或 PictureBox 等容器的 Paint 事件中绘制。
以下是标准的重写方法示例:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (Pen p = new Pen(Color.Blue, 3))
{
// 在客户端区域绘制一个红色填充、蓝色边框的矩形示例
Rectangle rect = new Rectangle(50, 50, 150, 100);
e.Graphics.FillRectangle(Brushes.LightGray, rect); // 可选:填充背景
e.Graphics.DrawRectangle(p, rect); // 绘制边框
}
}
常见问题与排错
Q: 矩形绘制后窗口刷新就消失了怎么办?
A: 这说明你的绘图逻辑没有绑定到控件的重绘生命周期中(如 Paint 事件)。Windows 系统在每次需要重绘控件时都会触发该事件,将绘图指令写入其中可保证内容持久化。
Q: 为什么看不到绘制的内容?
A: 检查坐标是否超出了可视区域,或者画笔颜色是否与背景色相同(例如白色画笔在白色背景上)。此外,确保 Pen 和 Graphics 已正确实例化且未被提前 Dispose。
总结
利用 C# GDI+ 绘制矩形是一项基础且实用的技能。关键在于理解 Pen 定义外观、Graphics 提供画布、以及 DrawRectangle 指定几何参数的三者协作关系。为了保证程序的稳定性和性能,请优先在 Paint 事件中进行绘图操作,并注意及时释放 Pen 等非托管资源。
以上就是C#使用GDI绘制矩形的详细内容,更多关于C#图形编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









