在.NET框架中,GDI+提供了强大的图形和图像处理能力。本文将介绍如何开发一个使用.NET 2.0的简单而功能强大的仪表盘控件。这种控件可以用于各种监控目的。将探讨如何使用GDI+来创建这种具有光泽感的控件。
如果创建的控件需要完全由用户绘制,那么应该重写OnPaint
和OnPaintBackground
方法。此外,还需要设置适当的控件样式。以下是一些常见的样式设置方法:
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
- 如果设置为true,则启用控件支持透明背景色。this.SetStyle(ControlStyles.ResizeRedraw, true);
- 允许在控件调整大小时重绘。this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
- 如果设置为true,则控件忽略窗口消息WM_ERASEBKGND以减少闪烁。this.SetStyle(ControlStyles.UserPaint, true);
- 如果设置为true,则控件自己绘制,而不是操作系统绘制。this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
- 如果设置为true,则控件首先绘制到缓冲区,而不是直接绘制到屏幕上,这可以减少闪烁。当控件需要重绘时,例如调整大小时或窗体最小化和最大化时,将调用OnPaint
方法。
OnPaintBackground
方法用于绘制窗口的背景(以及形状),并且保证速度较快。相比之下,OnPaint
方法用于绘制细节,可能会较慢,因为个别绘制请求被合并成一个覆盖所有需要重绘区域的Paint
事件。例如,如果想为控件绘制渐变色背景,可以调用OnPaintBackground
。
尽管OnPaintBackground
具有事件命名法,并接受与OnPaint
方法相同的参数,但它不是一个真正的事件方法。没有PaintBackground
事件,OnPaintBackground
不会调用事件委托。在重写OnPaintBackground
方法时,派生类不需要调用基类的OnPaintBackground
方法。
首先,来看如何绘制刻度盘。刻度盘需要一个刻度尺、阈值指示器、一些文本以及需要显示的当前值。绘制刻度尺需要计算在刻度盘周长上绘制规则的位置。假设需要从90度到270度绘制一个从0到10的刻度尺。在这种情况下,度数的差值(270-90=180)必须分成10部分。要找到每个部分的绘制位置,需要以下公式:
x = centerX + radius * cos(180/partNo)
y = centerY + radius * sin(180/partNo)
注意:在使用Math.Cos
或Math.Sin
时,需要以弧度为单位给出角度。找到位置后,可以在周长上绘制任何类型的刻度标记。选择绘制一条线作为刻度标记。由于刻度盘区域不会经常更改,可以在重写的OnPaintBackground
方法中绘制。
指针可能需要经常重绘。因此,最好在OnPaint
方法中绘制它。找到指针位置的逻辑与绘制刻度尺的逻辑相同。可以使用graphicsObj.FillPolygon()
方法绘制指针,并将其转换为代表当前值的任何角度。否则,指针可以在当前值的每次更改时重绘。
绘制光泽感非常简单。只需要在绘制完所有刻度盘和指针后,用渐变色填充两个椭圆。LinearGradientBrush
类提供了绘制渐变填充的能力。将渐变层覆盖在刻度盘上,就可以得到光泽感,如下图所示。
这个AquaGauge
控件可以像Windows提供的任何其他用户控件一样使用。以下是一些控件特定的属性,可以用来配置这个仪表盘以满足需求。
属性名称 | 类型 | 描述 |
---|---|---|
DialColor | Color | 获取或设置仪表盘的背景色。 |
DialText | String | 获取或设置仪表盘刻度盘上显示的文本。 |
EnableTransparentBackground | bool | 启用或禁用透明背景色。注意:启用此选项可能会降低性能并可能导致控件闪烁。 |
Glossiness | float | 获取或设置光泽强度。 |
MaxValue | float | 获取或设置仪表盘刻度尺上显示的最大值。 |
MinValue | float | 获取或设置仪表盘刻度尺上显示的最小值。 |
NoOfDivisions | int | 获取或设置仪表盘刻度尺上的刻度数。 |
NoOfSubDivisions | int | 获取或设置刻度尺上每个刻度的细分数。 |
RecommendedValue | float | 获取或设置刻度尺上的推荐值。这将用作绘制阈值区域的支点。 |
ThresholdPercent | float | 获取或设置刻度尺上的阈值区域百分比。 |
Value | float | 获取或设置指针指向的值。 |
当绘制包含大量操作的图像时,建议先在图像对象上绘制,然后再绘制。例如,绘制仪表盘刻度盘需要进行大量消耗CPU的操作。因此,可以先将刻度盘绘制到图像上,然后使用graphicsObj.DrawImage()
进行绘制。每当刻度盘属性发生变化时,可以重新创建图像对象。这将提高性能。