Win8MarqueeProgressIndicator 控件






4.93/5 (13投票s)
本文介绍了一个名为 Win8MarqueeProgressIndicator 的自定义控件。
简介 [^]
 
  本文介绍了一个名为 Win8MarqueeProgressIndicator 的控件,该控件是应一位读者对 Win8ProgressRing 控件 的请求而开发的。基本上,该控件是对 Win8ProgressRing 控件的扁平化处理。
这里只对其实施方式进行简要讨论。在接下来的讨论中,由开发人员指定的属性将以 粗体混合大小写 的文本显示。软件内部使用的变量将以 斜体小写 的文本显示。
目录
符号 [^] 将读者带回到目录的顶部。
视觉属性 [^]
 
    Win8MarqueeProgressIndicator 控件有两个属性,它们构成了用户看到的视觉图像。
开发人员通过将控件从工具箱拖放到窗体上的位置来指定控件的左上角。该位置在控件的图形环境中成为 ( 0, 0 )。开发人员通过拖动控件的调整柄或指定 Control_Width 属性来指定 control_width。经过一些计算后,control_height 被设置为等于 indicator_diameter。
指示器颜色默认为白色。要更改指示器颜色,开发人员通过 Indicator_Color 属性指定新颜色。
控件的背景是透明的,无法更改。
控件属性 [^]
Win8MarqueeProgressIndicator 控件具有以下可供开发人员使用的属性:
| 名称 | 描述 | |
| 动画 | 获取或设置一个值,该值指示控件是否自动移动指示器。如果为 true,则控件在无需进一步干预的情况下移动指示器;如果为 false,则控件仅在调用 Pulse 方法时移动指示器。默认值为 true。 | |
| Control_Width | 获取或设置控件的宽度。更改时,此属性还会导致控件的其他内部值发生更改。为 Control_Width 提供的值必须是 33 的倍数,且大于等于 99 且小于等于 462。默认值为 462 像素。当 Control_Width 更改时,将调用以下方法。 // ********************** adjust_control_dimensions_from_width
void adjust_control_dimensions_from_width ( int new_width )
    {
    indicator_diameter = round ( 
                             ( double ) new_width / 
                             ( double ) MAXIMUM_POSITIONS );
    control_width = indicator_diameter * MAXIMUM_POSITIONS;
    control_height = indicator_diameter;
    this.Width=control_width;
    this.Height = control_height;
    } | |
| Indicator_Color | 获取或设置 Win8MarqueeProgressIndicator 控件中指示器的颜色。默认值为 Color.White。 | |
| Refresh_Rate | 获取或设置指示器移动之间的时间(以毫秒为单位)。该值必须大于等于 10,且小于等于 200。默认值为 100 毫秒。 | 
Pulse 方法用于在每次调用时旋转指示器一次。其签名如下:
  public void Pulse ( )
    
  
  实现 [^]
 
    Win8MarqueeProgressIndicator 控件是一个 用户绘制控件。当控件的 OnPaint 方法被调用时,控件的部分内容将被绘制。
控件的图形由两个不同的图形图像组成:背景图形和指示器图形。
背景图形一旦绘制完成,除非 Control_Width 被更改,否则不需要重新绘制。指示器图形必须在背景图形重新绘制时;当动画更改指示器位置时;或当指示器颜色更改时重新绘制。
控件由六个圆形指示器组成,它们沿着控件的宽度向右移动。在最右端,指示器会绕回到最左端。最初,指示器位于控件宽度的中心。
注意控件使用 Windows 坐标系,其中 x 轴值向右增加;y 轴值向下增加;角度从 x 轴逆时针测量。
从最右侧的指示器开始,它被移动到下一个允许的指示器位置(即,位置 18 的指示器被移动到位置 20)。在控件中心右侧的位置会导致指示器看起来在加速。当一个指示器移动到位置 32 时,它的下一个位置将是 0。现在,当指示器向右移动时,它应该看起来在减速。
draw_indicator_graphic 在每次间隔计时器触发 elapsed 事件时被调用。
    // ************************************ draw_indicator_graphic
    void draw_indicator_graphic ( Graphics graphics )
        {
        Brush       brush = new SolidBrush ( Indicator_Color );
        Rectangle   rectangle = new Rectangle ( );
        for ( int i = ( MAXIMUM_INDICATORS - 1 ); 
                  ( i >= 0 ); 
                  i-- )
            {
            int     index;
            double  position;
            int     x;
            int     y;
            index = position_indices [ i ];
            if ( index >= POSITIONS )
                {
                index = 0;
                }
            position = positions [ index ];
            x = round ( position * 
                        ( double ) indicator_diameter );
            y = 0;
            rectangle.Location = new Point ( x, y );
            rectangle.Size = new Size ( indicator_diameter,
                                        indicator_diameter );
            graphics.FillEllipse ( brush, rectangle );
            index++;
            position_indices [ i ] = index;
            }
        brush.Dispose ( );
        }
  
  图形缓冲区 [^]
GraphicsBuffer 类包含一个离屏位图,用于绘制图形对象而不产生闪烁。虽然 .Net 提供了 双缓冲图形 功能,但对于 Win8MarqueeProgressIndicator 控件来说,它有点大材小用。
GraphicsBuffer 已包含在控件中。
结论 [^]
本文介绍了一个提供 Windows 8 风格的跑马灯进度指示器的控件。
参考文献 [^]
开发环境 [^]
Win8MarqueeProgressIndicator 控件是在以下环境中开发的:
| Microsoft Windows 7 Professional Service Pack 1 | |
| Microsoft Visual Studio 2008 Professional | |
| Microsoft .Net Framework Version 3.5 SP1 | |
| Microsoft Visual C# 2008 | 
历史 [^]
| 09/05/2013 | 原始文章 | 


