在 Windows 窗体控件上使用 System.Drawing.Graphics 进行绘画
本文关键字:Graphics Drawing 绘画 System 窗体 Windows 控件 | 更新日期: 2023-09-27 18:30:16
我对此完全陌生,我正在研究 C# 中的 Windows 窗体应用程序,并希望创建一个"LevelMeter",在我看来,这是一个进度条,左上角部分由具有窗体背景颜色的三角形覆盖。所以基本上我只想覆盖左上角的部分来模仿电平表,比如 VLC 播放器音量控制或类似。
我的问题是,如何在控件本身上绘画?我想创建一个用户控件,并在完成后添加到我的项目中。我可以使用 SolidBrush 和 FillPolygon 在窗体上绘制,但 MSDN 库在 ProgressBar.Paint 事件中指出:"此 API 支持 .NET Framework 基础结构,不打算直接从您的代码中使用。那么有没有办法在控件上绘画呢?
OK:"永不放弃实验"原则始终是正确的,这是我的解决方案:
我做了一个自定义的液位计:控制并使用FillPolygon方法绘制液位计的三角形,在我的例子中,只有8个不同的值,范围从0到7,所以我画了LevelMeter的7个"部分"。
protected override void OnPaint(PaintEventArgs pe)
{
if (this.valueNew > valueOld)
{
// increase, paint with green
this.CreateGraphics().FillPolygon(new SolidBrush(Color.LawnGreen), new Point[] { p2Old, p3Old, p3New, p2New });
}
else
{
// decrease, paint with BackColor
this.CreateGraphics().FillPolygon(new SolidBrush(this.BackColor), new Point[] { p2New, p3New, p3Old, p2Old });
}
}
为了避免每次值更改时清除和重新绘制 LevelMeter 而导致的"闪烁",我只重新绘制需要添加(绿色)或删除的部分(表单的背景颜色)。
您希望
重写自定义控件中的OnPaint(PaintEventArgs e)
。这将使您能够访问用于在控件上执行自定义绘制的System.Drawing.Graphics
(通过e.Graphics
)对象。
图形让你访问大量的方法,可以用来完成你需要的绘画。
例:
public class MyControl : Control {
// ...
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e); // Important - makes sure the Paint event fires
using (var pen = new Pen(Color.Black, 3)) {
e.Graphics.DrawRectangle(pen, 0, 0, this.Width, this.Height);
}
}
}