WinForms应用程序中的不确定进度指示器控件

WinForms应用程序中实现一个不确定的进度指示器控件,可以为用户提供一种视觉上的反馈,表明应用程序正在处理某些任务,但无法确定完成时间。这种类型的控件在用户界面设计中非常常见,尤其是在需要长时间处理数据或等待外部响应的情况下。本文将介绍如何创建一个类似于Google进度指示器的控件,它具有环形旋转指示器的特点。

尽管DirectX、XNA和WPF等技术已经得到了广泛的接受,但对于许多WinForms用户来说,这些高级方法可能并不适用。因此,本文介绍的控件开发将主要基于Drawing2D,这是一种更易于使用的绘图技术。

使用代码

该控件的运行时视图可以通过以下属性和方法进行控制。

以下是控件的一些关键属性:

  • Animate: 布尔值,用于启动(true)或停止(false)指示器动画。
  • AnnulusColor: 颜色,用于设置或获取环形的基础颜色,默认为淡青色。
  • BackgroundColor: 颜色,用于设置或获取控件的背景颜色,默认为系统颜色。
  • IndicatorAngularAdvance: 整数,表示指示器在每个tick或脉冲时移动的度数,默认为10度。
  • IndicatorColor: 颜色,用于设置或获取旋转指示器的颜色,默认为白色。
  • IndicatorType: 枚举,用于设置或获取控件是动画(ANIMATED)还是脉冲(PULSED)类型。
  • InnerRadius: 整数,用于设置或获取环形内圈的半径,默认为8像素。
  • OuterRadius: 整数,用于设置或获取环形外圈的半径,默认为12像素。
  • RefreshRate: 整数,用于设置或获取计时器tick间隔(即控件刷新的时间间隔),默认为150毫秒。
  • TransitionColor: 颜色,用于设置或获取环形中位位置的过渡颜色,默认为灰色。

控件提供了一个名为Pulse的方法,用于使指示器前进。

尺寸和颜色效果

控件的尺寸由OuterRadius(或)值决定。在前面的图中,外部矩形(红色)是控件的客户矩形。

颜色渐变效果被称为“混合”。在这种情况下,通过使用两种颜色的线性渐变画笔沿垂直方向进行线性混合,从起始颜色(AnnulusColor)到结束颜色(TransitionColor)获得效果。混合模式由两个等大小的数组“positions”和“factors”指定。两个数组都包含比例。positions数组包含从0.0F到1.0F的值,定义沿垂直方向的比例距离。factors数组包含从0.0F到1.0F的值,定义从起始颜色到结束颜色沿垂直方向的比例颜色。在前面的图中,括号中的值分别是线性渐变画笔混合的位置和因子。

构建控件

控件的构建分为十六个步骤。

控件的客户矩形和外部边界矩形都由OuterRadius的值指定。在第二步中,背景被着色为BackgroundColor。然后使用外部边界矩形来开发外部区域,首先通过从椭圆创建路径,然后从路径创建区域。内部边界矩形由InnerRadius的值指定,并用于开发内部区域。区域用于通过排除内部区域来定义环形(第8步)。颜色应用使用线性渐变画笔,起始颜色为AnnulusColor,结束颜色为TransitionColor。混合如前所述进行。环形在其自己的图形缓冲区中构建,并且仅在颜色或大小更改事件发生时进行修订。

指示器在其自己的图形缓冲区中构建,每次计时器tick或控件被脉冲时都会发生。指示器最初在环形的右中心位置绘制。然后进行平移和旋转变换。之后,两个图形(环形和指示器)都被渲染到屏幕上。

// 示例代码片段 public class GoogleProgressIndicator : Control { private GraphicsBuffer graphicsBuffer; private INDICATORTYPES indicatorType; private int indicatorAngularAdvance; private Color indicatorColor; private int innerRadius; private int outerRadius; private Color annulusColor; private Color backgroundColor; private Color transitionColor; private int refreshRate; // 构造函数 public GoogleProgressIndicator() { this.indicatorType = INDICATORTYPES.ANIMATED; this.indicatorAngularAdvance = 10; this.indicatorColor = Color.White; this.innerRadius = 8; this.outerRadius = 12; this.annulusColor = Color.PaleTurquoise; this.backgroundColor = SystemColors.Control; this.transitionColor = Color.Gray; this.refreshRate = 150; this.graphicsBuffer = new GraphicsBuffer(); } // 属性和方法... }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485