Aqua Gauge






4.93/5 (152投票s)
使用 GDI+ 和 Aqua Skin 开发的 Gauge 控件。

引言
我选择开发这个.NET用户控件来探索简单而强大的.NET GDI+。这个使用.NET 2.0开发的简单仪表控件可以满足各种监控需求。让我们看看如何使用GDI+开发一个这样光泽的控件。
重写的UserControl方法
通常,如果我们创建完全由用户绘制的用户控件,我们应该重写OnPaint
和OnPaintBackground
方法。此外,还应适当设置控件样式。可以使用this.SetStyle(ControlStyles.XXXXX, true/false);
设置以下常见样式。
支持透明背景色 |
如果设置为true ,这将使您的控件支持透明背景色。 |
ControlStyles.ResizeRedraw |
允许在控件调整大小时重绘。 |
ControlStyles.AllPaintingInWmPaint |
如果为true ,则控件会忽略窗口消息WM_ERASEBKGND 以减少闪烁。此样式应仅在 UserPaint 位设置为true 时应用。 |
ControlStyles.UserPaint |
如果为true ,则控件会自行绘制,而不是由操作系统绘制。 |
ControlStyles.OptimizedDoubleBuffer |
如果为true ,则控件首先绘制到缓冲区而不是直接绘制到屏幕,这可以减少闪烁。如果将此属性设置为true ,则还应将AllPaintingInWmPaint 设置为true 。 |
每当控件需要重绘时,OnPaint
和OnPaintBackground
方法都会被调用。例如,当控件大小调整或窗体最小化和最大化时,将调用OnPaint
方法。
OnPaintBackground与OnPaint
OnPaintBackground
绘制窗口的背景(以及形状),并且保证速度很快。相比之下,OnPaint
绘制细节,可能速度较慢,因为单个绘图请求会合并为一个Paint
事件,该事件涵盖了所有需要重绘的区域。例如,如果您想为控件绘制渐变色背景,您可能希望调用OnPaintBackground
。
虽然OnPaintBackground
具有类似事件的命名法,并且接受与OnPaint
方法相同的参数,但OnPaintBackground
不是一个true
的事件方法。没有PaintBackground
事件,并且OnPaintBackground
不调用事件委托。重写OnPaintBackground
方法时,派生类不需要调用其基类的OnPaintBackground
方法。
绘制仪表盘
首先,让我们看看如何绘制刻度盘。刻度盘需要一个刻度、一个阈值指示器、一些文本和要显示的当前值。
绘制刻度需要计算要绘制在圆周上的刻度的位置。假设我们要绘制一个从0到10的刻度,从90度到270度角。在这种情况下,度数差(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控件
此AquaGauge
控件可以像Windows提供的任何其他用户控件一样使用。以下是控件特有的属性,可用于配置此仪表以满足您的需求。
属性名称 | 类型 | 描述 |
DialColor |
Color |
获取或设置仪表盘的背景颜色。 |
DialText |
字符串 |
获取或设置显示在仪表盘上的文本。 |
EnableTransparentBackground |
bool |
启用或禁用透明背景色。注意:启用此选项会降低性能,并可能导致控件闪烁。 |
Glossiness |
float |
获取或设置光泽效果的强度。 |
最大值 |
float |
获取或设置仪表盘刻度上显示的最大值。 |
最小值 |
float |
获取或设置仪表盘刻度上显示的最小值。 |
NoOfDivisions |
int |
获取或设置仪表盘刻度上的分度数量。 |
NoOfSubDivisions |
int |
获取或设置刻度上每个分度显示的子分度数量。 |
RecommendedValue |
float |
获取或设置刻度上的推荐值。这将用作绘制阈值区域的枢轴点。 |
ThresholdPercent |
float |
获取或设置刻度上的阈值区域百分比。 |
值 |
float |
获取或设置指针指向的值。 |
关注点
每当我们在进行大量图像处理时,建议在图像对象上进行绘制,然后进行显示。例如,绘制仪表盘需要大量的CPU密集型操作。因此,我们可以将刻度盘绘制到图像上,然后使用graphicsObj.DrawImage()
进行绘制。每当更改刻度盘属性时,我们都可以重新创建图像对象。这将提高性能。
历史
- 版本 1.0 - 初始版本
欢迎所有评论和建议。