返回首页

{A}
{S0}简介
进度条控件的Windows用户界面的一个可怕的很多;哎呀,我们没有他们呢?他们在那里的地方,我们需要告诉我们的电脑通过一个任务是多远。他们是奇妙的简单和易于使用。NET框架,因此,容易使一对夫妇面板和一个UserControl。 Äôve了几个简单的属性和功能,而你,你自己的进度条控件,使用您的WinForms应用程序。
然而,在微软的建设中的深的地方,一个程序员创建Windows进度条控件,在我看来,这是相当不友好。您可以AOT甚至没有付出巨大的努力改变各种颜色,如果在所有!嘛??我们,Äôll很快改变这一切。背景
我们的最终结果将是一个简单的奇迹和设计的胜利,这样的事情:
栏的颜色,剩余的栏的颜色,边框颜色,边框的知名度,和光泽的知名度都将是完全可定制,为您的应用带来一些额外的香料。
现在,我们不会写复杂的代码苦苦为了实现这一目标。不要告诉我的老师,但我们将使用... ...面板。没错!面板!不起眼的面板将善加利用,在我们的项目。事实上,整个控制是基于他们周围,他们四人要精确。但是,任何你之前在那里开始问我为什么不使用GDI,这是因为小组将做得很好。为什么overcomplicate事情呢?使用代码
首先,我们将创建一个新的VB Express 2008的类库项目,删除"Class1的",并添加一个新的UserControl??代码> Col​​ourProgressBar??在设计师的控制和调整大小以约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财产。

回答

评论会员:ThePhilProject 时间:2011/12/28
忽略内存痴迷唱反调,我只是想惊叹于设计简单的胜利,是你的control.nbsp;
您的文章是明确和翔实的愉快的阅读和即使的解决方案是不是如内存,高效的绘画控制自己,这是有趣的,看看面板控制的创新使用。 NBSP

谢谢MrWolfy
评论会员:MrWolfy 时间:2011/12/28
您好

好吧,我不得不说,回国后短暂休息后,从编程的代码项目,它的清新和令人愉快的的,有人恭维我这篇文章!非常感谢您的积极反馈!

MrWolfy {五}
评论会员:戴夫Kreskowiak 时间:2011/12/28
这是"偷懒"的方式做到这一点。我不会告诉任何人都可以使用更多的控制,做一些事情,可以在一个。这是过于"重量级"的解决方案做这么简单的东西。窗体上有更多的控制,不再是形式创建和重绘。降低下来,以一个单一的控制,油漆本身和你有最好的解决方案的东西,可以被应用到其他控件
评论会员:MrWolfy 时间:2011/12/28
您好!

表现的确似乎是一个大问题,在这里,我明白为什么它可能是。我可能已经使用额外的控制,要做到这一点激进的一点点,但我认为,1票是苛刻了一点。控制工程,没有什么它应该和代码注释,易于阅读;"!一个更好的ProgressBar - 使用面板"的文章的标题清楚地表明,文章的内容涉及使用面板,以达到预期的效果,如果说的不是你想要做的,然后请留下一个建议,我写的比与损坏我的文章的等级约在今后相当的替代品的文章极低的投票。

在这篇文章(这是高于一切,这一点,我打算证明)的清晰和易于理解的方式显示进度条背后的数学和逻辑,新颖的方法即使不下井太
好了,它肯定值得为此一点点的信用。
谢谢!

MrWolfy {五}
评论会员:肯尼麦基 时间:2011/12/28
一个完整的内存浪费。它甚至比这更容易地创建一个ProgressBar,看上去伟大而进行的伟大
评论会员:。MrWolfy 时间:2011/12/28
您好!

就像我说,我只是想证明一个ProgressBar如何工作的基本原则,而不是设计下一代的控制。但无论如何感谢 - 我会紧记的性能问题时,我写在未来的文章

为回馈!

MrWolfy {五}
评论会员:MrWolfy 时间:2011/12/28
使用面板要做到这一点是绝对内存的浪费,除了众所周知的不良做法,
评论会员:。Invisionsoft 时间:2011/12/28
!HI

我只是想勾勒一个ProgressBar如何工作的基本原则,而不是试图建立一个超高速,下一代的控制,这将使我的富人和名人。我明白,这种控制较慢的计算机上的性能问题,但绘制这些控件的基本技术是在一个易于理解的格式,方便初学者的证明;它是这样的,我打算证明。
,但是,我会考虑到性能问题承担,当我写在未来的文章。
为回馈!

MrWolfy {五}
评论会员:MrWolfy 时间:2011/12/28
。阔佬,看起来不错,工程