C# WinForms 窗体 GUI 开发与绘图功能详解可分为以下几个核心部分:
一、WinForms 窗体基础
1. 创建窗体项目
- 新建
Windows Forms App (.NET Framework)
项目 - 主窗体继承自
System.Windows.Forms.Form
- 通过
Application.Run(new MainForm())
启动窗体
2. 常用控件与布局
csharp
// 添加按钮控件示例
Button btn = new Button();
btn.Text = "点击我";
btn.Location = new Point(20, 20);
btn.Click += Btn_Click; // 事件绑定
this.Controls.Add(btn);
3. 事件处理机制
- 鼠标事件:
MouseClick
,MouseMove
- 键盘事件:
KeyPress
,KeyDown
- 窗体生命周期事件:
Load
,Closing
,Closed
二、绘图核心组件(GDI+)
1. 绘图核心类
Graphics
: 绘图画布对象Pen
: 用于绘制线条和形状轮廓Brush
: 用于填充图形内部Color
: 颜色定义(支持 ARGB 透明度)
2. 绘图触发机制
- 重写
OnPaint
方法 或订阅Paint
事件
csharp
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawLine(Pens.Red, 0, 0, 100, 100);
}
三、常见绘图操作
1. 基本图形绘制
csharp
// 绘制矩形
Rectangle rect = new Rectangle(50, 50, 200, 100);
using (Pen pen = new Pen(Color.Blue, 2))
{
e.Graphics.DrawRectangle(pen, rect);
}
// 填充椭圆
using (SolidBrush brush = new SolidBrush(Color.Green))
{
e.Graphics.FillEllipse(brush, 100, 100, 150, 150);
}
2. 文本绘制
csharp
using (Font font = new Font("Arial", 12))
using (Brush brush = new SolidBrush(Color.Black))
{
e.Graphics.DrawString("Hello WinForms!", font, brush, 50, 50);
}
3. 图像处理
csharp
Image img = Image.FromFile("test.jpg");
e.Graphics.DrawImage(img, new Rectangle(0, 0, 200, 200));
四、高级绘图技巧
1. 双缓冲技术
避免闪烁:
csharp
this.DoubleBuffered = true; // 在窗体构造函数中设置
2. 自定义坐标系
csharp
// 设置坐标系原点在窗体中心
e.Graphics.TranslateTransform(this.Width/2, this.Height/2);
// 缩放坐标系
e.Graphics.ScaleTransform(1, -1); // Y轴向上
3. 路径绘制
csharp
using (GraphicsPath path = new GraphicsPath())
{
path.AddLine(0, 0, 100, 100);
path.AddArc(50, 50, 100, 100, 0, 90);
e.Graphics.DrawPath(Pens.Red, path);
}
五、GUI与绘图结合案例
1. 实时折线图控件
csharp
public class ChartControl : Control
{
private List<float> dataPoints = new List<float>();
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (dataPoints.Count < 2) return;
using (Pen pen = new Pen(Color.Red, 2))
{
for (int i = 1; i < dataPoints.Count; i++)
{
e.Graphics.DrawLine(pen,
(i-1) * 10, dataPoints[i-1],
i * 10, dataPoints[i]);
}
}
}
public void AddDataPoint(float value)
{
dataPoints.Add(value);
this.Invalidate(); // 触发重绘
}
}
2. 交互式绘图板
csharp
public partial class DrawingBoard : Form
{
private Point previousPoint;
private Bitmap drawingSurface;
public DrawingBoard()
{
InitializeComponent();
drawingSurface = new Bitmap(ClientSize.Width, ClientSize.Height);
this.MouseDown += DrawingBoard_MouseDown;
this.MouseMove += DrawingBoard_MouseMove;
}
private void DrawingBoard_MouseDown(object sender, MouseEventArgs e)
{
previousPoint = e.Location;
}
private void DrawingBoard_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
using (Graphics g = Graphics.FromImage(drawingSurface))
{
g.DrawLine(Pens.Black, previousPoint, e.Location);
}
previousPoint = e.Location;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(drawingSurface, Point.Empty);
}
}
六、注意事项
- 资源释放:及时释放
Pen
,Brush
,Graphics
等对象(建议使用using
语句) - 性能优化:复杂图形建议使用
Bitmap
缓存绘制结果 - 高DPI支持:设置
AutoScaleMode = AutoScaleMode.Dpi
适应不同分辨率