65.9K
CodeProject 正在变化。 阅读更多。
Home

面向所有人的平滑进度条! 第 2 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (67投票s)

2005年2月19日

4分钟阅读

viewsIcon

203429

downloadIcon

2738

一个功能多样的进度条控件,支持垂直和水平模式、渐变等更多功能。

引言

我对我的SmoothProgressBar的代码进行了彻底的重构,现在它支持使用渐变来显示控件的前景和背景。此功能是可选的,默认为实心前景和背景,就像原始的SmoothProgressBar控件一样。我决定将此版本作为新文章发布,以便您可以将代码技术与原始版本进行比较。

背景

请参阅第一篇文章,了解有关此控件的背景信息以及我创建它的原因。

使用代码

我添加了几个新属性,并更改了原始控件中的一些内容。我发现如果属性名为Step,并且用方括号括起来,就可以正常工作,例如:

 Public Property [Step]() As Integer

不带方括号声明它会导致错误,因为Step是VB中的一个关键字,所以Visual Studio会报错:Keyword is not valid as an identifier.

我还将递增Value属性的方法名称从Stepit()更改为PerformStep(),以便更容易地用此控件替换.NET自带的ProgressBar控件,因为.NET控件中使用的就是这个名称。

为了支持渐变显示,控件中有几个新属性。首先,ProgressBarColor属性已重命名为BarColor1。此外,还有一个BarColor2属性,用于设置进度条(前景)渐变混合的结束颜色。当然,还有BackColor1BackColor2属性,它们对控件的背景色具有相应的效果。

Horizontal属性已重命名为OrientationReverse属性现已改为Direction。它们不再是Boolean类型,而是使用Enum类型的值,以更准确地描述其功能。

新属性BarColorStyleBackColorStyle默认为Solid;要使用渐变混合,请将其更改为GradientBarGradientModeBackGradientMode枚举了标准的渐变方向值:HorizontalVerticalForwardDiagonalBackwardDiagonal

BarSigmaModeBackSigmaMode默认为Normal。当设置为SigmaBell时,BarSigmaFocusBarSigmaScaleBackSigmaFocusBackSigmaScale属性用于塑造定义渐变中心和衰减率的钟形曲线。BarGradientStretch控制进度条(前景)的渐变混合是否随着进度条的推进而拉伸。如果这听起来不清楚,只需下载示例代码并尝试这些属性值,以便更好地理解它们的作用。

关注点

我已放弃在Value属性的setter代码部分计算更新区域的技术。最初这样做是为了允许只更新控件中与前一个值不同的部分。后来我决定在更改Value属性后简单地使整个控件失效的代码更少,但这会导致控件重绘时闪烁,因此需要更新区域代码。相反,我从Control继承了该控件,而不是UserControl,并将Style设置为使用双缓冲来避免闪烁。这通过以下语句实现,放在Sub New()中,在调用InitializeComponent()之后:

Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer _
      Or ControlStyles.UserPaint, True)

值得注意的是,UserPaint样式仅适用于派生自Control的类。

另一点值得注意的是,Control中的某些属性对于SmoothProgressBar是不需要的,并且通过将Browsable属性设置为False来隐藏它们在属性网格中显示。例如:

<Browsable(False)> _
   Shadows ReadOnly Property Font() As Font
      Get
         Return MyBase.Font
      End Get
   End Property

该属性必须声明为Shadows,否则Visual Studio会报错。

property 'Font' shadows an overridable method in a base class. 
To override the base method, this method must be declared 'Overrides'.

结论

我认为这将是我创建更好进度条的最后努力,我对结果相当满意。请下载源代码和演示项目,将其与第一篇文章进行比较,并留下评论!我注意到原始文章有近2500次浏览,但只有两个人评分,所以如果你喜欢这篇文章和这个控件(即使你不喜欢),请花点时间给它评分。我等你回复!

历史

  • 2005年2月19日
    • 初始发布。
  • 2005年2月28日
    • 添加了SPB_Help.zip,其中包含SmoothProgressBar.chm帮助文件和SPB.xml,以便在Visual Studio中获得智能感知支持(有关详细信息,请参阅下载中的Read Me.txt文件)。
© . All rights reserved.