!{A}
{S0}简介
进度条控件的Windows用户界面的一个可怕的很多;哎呀,我们没有他们呢?他们在那里的地方,我们需要告诉我们的电脑通过一个任务是多远。他们是奇妙的简单和易于使用。NET框架,因此,容易使一对夫妇面板和一个UserControl。 Äôve了几个简单的属性和功能,而你,你自己的进度条控件,使用您的WinForms应用程序。
然而,在微软的建设中的深的地方,一个程序员创建Windows进度条控件,在我看来,这是相当不友好。您可以AOT甚至没有付出巨大的努力改变各种颜色,如果在所有!嘛??我们,Äôll很快改变这一切。背景
我们的最终结果将是一个简单的奇迹和设计的胜利,这样的事情:
栏的颜色,剩余的栏的颜色,边框颜色,边框的知名度,和光泽的知名度都将是完全可定制,为您的应用带来一些额外的香料。
现在,我们不会写复杂的代码苦苦为了实现这一目标。不要告诉我的老师,但我们将使用... ...面板。没错!面板!不起眼的面板将善加利用,在我们的项目。事实上,整个控制是基于他们周围,他们四人要精确。但是,任何你之前在那里开始问我为什么不使用GDI,这是因为小组将做得很好。为什么overcomplicate事情呢?使用代码
首先,我们将创建一个新的VB Express 2008的类库项目,删除"Class1的",并添加一个新的UserControl??代码> ColourProgressBar??在设计师的控制和调整大小以约200像素由30。你已经可以看到它正在形成!这是快!{S2}
添加一个面板,它ProgressFull的名字,并停靠到左侧,然后又停靠到"补",并将它命名为ProgressEmpty。更改ProgressFull任何你喜欢的的BackColor属性,除了从"控制"(这是为了让我们可以看到我们的工作成果)。你会注意到,这是开始看起来越来越像一个进度条,但我们仍然需要添加光泽。把小组内右侧面板。停靠在顶部,调整它的高度为10,并调用它GlossRight;在左侧做相同,并调用它GlossLeft。然后,我们只需要改变背景色为100小时,255,255,255。这台的光泽面板的BackColor是半透明的白色,增加控制的整体外观。
最后,设置填充持有我们所有的面板,以1,1,1,1的实际控制。围绕我们的进度条,这意味着,我们Äôve了,为了改变边框的颜色,改变背景颜色,这将创建一个细边框。
继续并单击"调试"。变化控制在TestContainer的BackColor,看看如何边框的颜色变化。很酷吧?
好吧!现在,我们的控制看起来就像是最后的结果:
现在,我们刚刚得到了让它发挥作用,这是真的没有那么难。首先,我们有进口的事情,以帮助我们,这真的是我们的代码的顶部加入以下几行简单的代码写:Imports System.ComponentModel
Imports System.Drawing
这些行只是进口的,我们需要我们的进度条代码。NET框架的所有必要的部分。接下来,几个全局变量进行数据之间的职能:为整数= 20 - 私人ProgressUnit的金额,以像素为单位,我们的进度条递增英寸私人ProgressValue为整数= 1 - 充满MAXVALUE金额。私人MaximumValue为整数= 10 - 进度条的最大值。私人IsBorderEnabled布尔= TRUE - 设置是否边境上的ProgressBar启用。布尔= TRUE私人ShowGloss - 设置是否光泽ProgressBar的显示。
,所以,出路,让AOS概述我们的主要职能。这些都是简单的,只是其中有两个。的UpdateProgress()??所有功能于一身的的功能,更新的进度条,根据全局变量改变它。UpadateGloss() - 一个单独的函数,根据全局变量改变的光泽。
到目前为止,UpdateGloss()函数是最简单的。它不仅承载了一个非常简单的操作,调整每个GlossPanel根据UserControl的大小:{C}
的UpdateProgress()函数是更长的时间,但仍原理类似。Private Function UpdateProgress() As Boolean
Try
'Recalculate Globals [
ProgressUnit = (Me.Width / MaximumValue)
ProgressFull.Width = (ProgressValue * ProgressUnit)
']
'Hide Or Show GlossPanels According To Globals [
If ShowGloss Then
GlossPanelLeft.Visible = True
GlossPanelRight.Visible = True
Else
GlossPanelLeft.Visible = False
GlossPanelRight.Visible = False
End If
']
'If At Maximum Value, Fill The ProgressBar [
If ProgressValue = MaximumValue Then
If IsBorderEnabled Then
ProgressFull.Width = (Me.Width - 2)
Else
ProgressFull.Width = Me.Width
End If
End If
']
'Hide Or Show The Borders According To Globals [
If IsBorderEnabled Then
Me.Padding = New Windows.Forms.Padding(1)
Else
Me.Padding = New Windows.Forms.Padding(0)
End If
']
Catch MyException As Exception
'Return A Failure And Exit [
Return False
Exit Function
']
End Try
'Return A Success [
Return True
']
End Function
由于从代码可以清楚地看到,几乎所有围绕全局变量。这将创建一个不友好的编程接口?你打赌不会。之前天NET和其他面向对象编程方法,编程是非常线性的:用户输入接收,处理和输出,那样简单。但现在,我们可以使用。NET,创造这么多。输入所有时代的最伟大的编程胜利之一!属性!
我们的控制收到如何执行在窗体设计器,并在程序本身通过属性的说明,我们的UserControl的使用,其中许多。数来控制的外观和美学,以及一些使事情和工作的方式,一个进度条:ProgressMaximumValue整数??进度条的最大值。的BorderColor颜色??进度条边框的颜色。ShowBorder布尔??边界是否显示或不显示。IsGlossy布尔??无论两个GlossPanels显示与否。BarColor颜色??进度条的填充部分的颜色。EmptyColor颜色??进度栏的空白部分的颜色。
我不会在本文中所有这些属性,因为他们大多是标准的获取,设置样式属性,但是,他们几个是特别重要的要注意。<DefaultValue(1), _
Description("The total progress of the ProgressBar."), _
Category("ProgressBar Properties")> _
Public Property Value() As Integer
Get
'Return The Property [
Return ProgressValue
']
End Get
Set(ByVal value As Integer)
'Don't Allow More Than The Maximum Value [
If value <= MaximumValue Then
ProgressValue = value
Else
ProgressValue = MaximumValue
End If
']
'Update The ProgressBar [
UpdateProgress()
']
End Set
End Property
首先,请注意的UpdateProgress()是在函数的末尾调用。这是非常重要的,因为它的UpdateProgress()函数更新进度条,根据全局变量。没有它,属性将没有任何效果可言!
接下来,看到我们不允许超过,在进度条中的财产进入的进度条的最大值。在输入值过高的情况下,进度栏将默认的最大价值,并不会超越边界控制本身,它可以造成许多不便。但是,为了确保可靠的编程,我们也必须到位ProgressMaximumValue财产的限制:<DefaultValue(10), _
Description("The maximum value of the ProgressBar."), _
Category("ProgressBar Properties")> _
Public Property ProgressMaximumValue() As Integer
Get
'Return The Property [
Return MaximumValue
']
End Get
Set(ByVal value As Integer)
If value > Me.Width Then
MaximumValue = Me.Width
Else
MaximumValue = value
End If
'
'Update The ProgressBar [
UpdateProgress()
']
End Set
End Property
一开始,MaximumValue不能超过宽度控制在像素。这可能会产生严重的问题,甚至导致不被显示在所有的酒吧,如果MaximumValue是像10000的东西。作为标准,在年底的UpdateProgress()被调用。
接下来,我们添加一些事件处理程序的某些部分,我们的控制,这将影响一个或多个我们的面板:ColourProgressBar_Load??只需拨打的UpdateProgress()函数来初始化的进度。ColourProgressBar_PaddingChanged??唐,AOT允许填充超过IsBorderEnabled全球指定的金额。ColourProgressBar_Resized??调整的光泽度的大小,高度,然后调用的UpdateProgress()。ColourProgressBar_DockChanged??漂亮Resized事件同样的原因,因为控制调整大小时,他们被告席。
,AOS在快速浏览一下这两个内容:PaddingChanged和resize事件:If IsBorderEnabled Then
Me.Padding = New Windows.Forms.Padding(1)
Else
Me.Padding = New Windows.Forms.Padding(0)
End If
这是PaddingChanged事件的内容。这样做是确保进度条根据IsBorderEnabled变量的正确填充。 Resized事件处理程序执行类似的任务。If Value <= MaximumValue Then
UpdateProgress()
End If
调用UpdateGloss功能重组的一切反映进度条控件的大小。我们还没有完成,但是。我们需要添加一些事件给我们的控制。添加一个重要的是改进的Click事件。这一点很重要,因为只有实际控制应对目前的点击,而如果我们点击我们的任何面板,该事件不会引发。这是复杂的,但是。我们刚刚添加了一行代码:Public Shadows Event Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
一块蛋糕,见?一举,我们已经创建了一个Click事件的参考。现在,我们只需添加Click事件处理程序,我们四个小组,每个包含这行代码的事件:
这只是提高了实际控制的Click事件,而不是面板里面,便于编码控制是包含在应用程序时。如果这里没有涉及到的东西,看看示例代码和应用程序。我喜欢把我评论他们颇能。你有它!
很可能,最简单的方法来创建自己的进度条刚刚公布了所有看到的,和什么,AOS,依靠面板上的一个UserControl已被证明是一个GDI纯类库一样有效!所以,我们有,控制自己的控件为起点,希望能作为有用的,或可以在自己的应用程序时使用Windows进度栏是太丑陋,太不友善,或只是彻头彻尾的不适合你打算的目的。积分一个庞大的谢谢他的丝绸图标包(演示程序中使用),詹姆斯马克。访问他的网站。历史19/12/08 - 条载于21时12分。22/12/08 - 条更新10:20 - ProgressBarValue改变的价值,以更好地取代标准的进度条。 GlossOpacity财产。