我对此完全陌生,我正在使用 C# 开发 Windows 窗体应用程序,并想创建一个“LevelMeter”,在我的想法中,这是一个 ProgressBar,左上部分被一个具有窗体背景颜色的三角形覆盖. 所以基本上我只想覆盖左上部分来模仿电平表,比如 VLC Players 音量控制或类似的。
我的问题是,如何在控件本身上绘画?我想创建一个 UserControl 并在完成后添加到我的项目中。我可以使用 SolidBrush 和 FillPolygon 在表单上绘画,但 MSDN 库对 ProgressBar.Paint 事件的注释:“此 API 支持 .NET Framework 基础结构,不打算直接从您的代码中使用。” 那么有什么方法可以在控件上绘画吗?
OK:“永不放弃实验”的原则始终是正确的,这是我的解决方案:
我做了一个自定义的 LevelMeter:控制并使用 FillPolygon 方法来绘制 LevelMeter 的三角形,在我的例子中只有 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 导致的“闪烁”,我只重新绘制需要添加(绿色)或删除(表单的背景颜色)的部分。