返回首页

{A}{S0}简介
对于我无法解释的原因,我有一个进度条不合理的魅力。多年来,我看到一个进度条,我喜欢,并会尝试重新创建在C#中为我所用。这导致所有共享一个相对较小的功能设置在一个单一的父类的几个具体实现。然后,不久前,我看到几个,我想实现,但我不是在写他们从地面感兴趣。不过,我注意到,他们都共享了很多的特点。然后,我终于明白了,我可以生成几乎所有这些例子和热插拔组件,进度条绘制的某些部分设置多。该项目是启示的结果。组件结构
的想法,基本上,这是... ...有两个具体的实现进度条(加,专门重新WINRAR双进度条),每个建设更普遍的实施。这些实现使用一个IProgressBackgroundPainter实例,绘制一个背景,一个IProgressPainter实例,一个实例IProgressBorderPainter油漆边境。然后,可以选择,你可以任意数量IGlossPainter实例医生您的进展和/或背景画家。 IProgressPainter也可以使用自己的IProgressBorderPainter。 IProgressPainter和IGlossPainter都提供了一些基本功能的抽象实现。 ChainedGlossPainter,IGlossPainter抽象实施,是一个装饰,让您链的多重影响IGlossPainters。
所有这些组件的功能部件,您可以拖放到你的设计师,并在设计时设置它们之间的关系和属性。这使得它易于实验存在着不同的可能性,寻找什么最适合您的需求和口味。
如下所示是一个进度条实现,画家接口,和他们的抽象实现结构图:
所有的进度条实现的基本属性,你希望看到(即最大值,最小值,值)。他们也有ShowPercentage,这是一个布尔属性,决定是否绘制百分比文本上的酒吧,和ProgressPadding这是一个int,表示的像素数的进展,画家和边界之间的空间。 DualProgressBar增加MasterMaximum,MasterValue,MasterPainter,PaintMasterFirst和控制掌握进度。 DualProgressBar设计功能,如在WinRAR进度条,显示为银色的总体进展情况进展,并叠加到代表整体压缩比黄金进度总是较小。然而,这个酒吧可以用来显示个人和整体进步,特别是当非主的进展已填充使主进度可以根据看到的。背景画家
我现在有5的IProgressBackgroundPainter实现,其中三个具体的进度条(WINRAR,FruityLoops,拐杖糖)。{S2}普通的背景画家
PlainBackgroundPainter涂料单一颜色的背景。我用这个背景画家结合IGlossPainters最。就其本身而言,它远离有趣的,但它的加入掩盖的完美基地。{S3}渐变背景画家
GradientBackgroundPainter建掩盖之前的设想。它允许你指定一个顶部和底部的颜色,并与这两种颜色之间的渐变填充背景。 PlainBackgroundPainter的GradientGlossPainter可以达到同样的效果。所以,这样的背景下画家仅仅是一个方便的捷径。{S4}的糖果甘蔗背景画家
CandyCaneBackgroundPainter从现有的酒吧在我的老酒吧收集。这大概也可以重新PlainBackgroundPainter和掩盖。它匹配的CandyCaneProgressPainter,但它也可以与几乎任何其他进展,画家。{五}FruityLoops背景画家
FruityLoopsBackgroundPainter还内置了一个古老的酒吧,我是基于应用程序的进度条。它有一个匹配的进展画家。此背景画家也不是很可配置的,它是专为特定的设置为模拟FruityLoops酒吧。{中六}WinRAR的背景画家
RarBackgroundPainter还内置进度条基于一个古老的酒吧。它还具有匹配的进步和边境画家,这是由RarProgressBar使用。因为它是专效仿WINRAR酒吧,是不是可以配置的,你不能改变它的颜色,例如。{七}进展画家
有九个,其中大部分是我老收集进度条的IProgressPainter实现。它们都可以与粉饰装饰,但平原实施的目的是要共同帆布掩盖。平原进展画家
PlainProgressPainter,像普通的背景画家,只有填充纯色,这使得它为掩盖一个伟大的起点点的进展情况。除了颜色属性,您可以设置一种颜色的LeadingEdge属性。不设置上的进度条ProgressPadding价值,你可以通过平原的进步画家的ProgressBorderPainter属性设置一个IProgressBorderPainter实例同样的效果。呈斜角的画家
BevelledProgressPainter也就罢了,与一个单一的颜色进展,但它也斜面的两个像素边界的基础上基本颜色集的进度。由于IProgressPainter接口定义,一切进步的画家可以有一个IProgressBorderPainter设置其ProgressBorderPainter属性。呈斜角的渐变画家
BevelledGradientProgressPainter基本上是相同的MinColor和MaxColor属性,使用它来填充一个渐变的进展,只不过BevelledProgressPainter。金属进展画家
MetalProgressPainter是一个微妙而优雅的定制设计,从单一的基本颜色为基础的。理发北极
BarberPoleProgressPainter是另一个自定义的设计。这是两个进度画家,有一个问题与所有酒吧ProgressPadding财产之一。当控制大小,画家重建形象,使价值变动只需要移动的形象,符合整个酒吧。这是,我不是过分关注目前的限制。一个Java画家
JavaProgressPainter是根据我看到了一个Java应用程序曾几何时一个进度栏的定制设计。它总是补齐,所以设置填充将只是改变它更进一步,尽管你也可以给它一个负的填充,以迫使它填补所取得的进展空间。拐杖糖
CandyCaneProgressPainter股同样的策略,因此,作为BarberPoleProgressPainter相同的限制。它建立一个部分透明设计的基础上一个单独的基颜色。FruityLoops画家
FruityLoopsProgressPainter只有自身的配置属性,有两个可能的值,DoubleLayer和TripleLayer FruityType财产。垫好,并可以掩盖和/或接壤。但是,它最适合的设计,以配合FruityLoopsBackgroundPainter。WinRAR的进展画家
RarProgressPainter是一个非常简单的进度画家。虽然设计工作的RarBackgroundPainter和RarBorderPainter,它的工作原理与其他实现,因为它是如此简单。 ProgressType属性对应两种颜色WinRAR的使用金,银,。 ShowEdge财产绘制的领先优势,具体到WinRAR的画家。边境画家
边境画家可以用于边界的整个进度条,它们也可以被用于边境进展画家。 IProgressBorderPainter接口需要实现揭露BorderWidth属性,所以使用它的进度条可以确定的什么大小的进展矩形应。至于与其他组件,它有油漆和调整自己的方法。平原边境画家
随着PlainBorderPainter,你可以指定一个单位边界的颜色,或使用其凹陷或凸起的执行情况。圆角属性只是使部分透明的像素的位置,这给人一种微妙的四舍五入。 样式边境画家
StyledBorderPainter使用System.Windows.Forms.Border3DStyle值ControlPaint.DrawBorder3D()方法来绘制边框。正如你可以看到一些下面的例子,这些Border3DStyle边界在左侧的单个像素的边框的宽度和两个其他方面的像素宽度。自上IProgressBorderPainter BorderWidth属性只允许你指定一个单一的边框宽度,这条边界的画家有一些不良的副作用,但他们是微妙的,在大多数情况下难以察觉。
{S22的}


WinRAR的边境画家
RarBorderPainter是专门为使用RarProgressPainter和RarBackgroundPainter,但它确实给提出一个很好的酒吧外看。光泽画家
掩盖设计,让你把各种不同的进度条和背景上的透明度梯度。有四个光泽的实现,所有这些都继任的属性,让您他们一起链的多重影响。平光泽
FlatGlossPainter只是覆盖面积的颜色。设置样式(顶部或底部)的财产和PercentageCovered属性,可以控制该地区。它允许你指定一种颜色,该颜色的alpha值。 渐变光泽
GradientGlossPainter给你一个以上的顶部或底部的百分比,或整个表面的梯度。它使用的基本颜色,结合AlphaHigh和渐变的AlphaLow属性。您还可以控制的角度。例如使用90角; 270会反转的表现。 中东光泽
从中间MiddleGlossPainter梯度。再次,通过Style属性,可以光泽的顶部,底部,或完整的表面。像GradientGlossPainter,它使用一种颜色的渐变和两个alpha值。 回合光泽
关闭的顶部和/或底部边缘RoundGlossPainter梯度。 GradientGlossPainter的MiddleGlossPainter一样,它使用一种颜色的渐变和两个alpha值。取而代之的是百分比,像其他的掩盖,这光泽有TaperHeight的属性,允许您设置梯度从边缘的像素数量。在下面的例子,TaperHeight设置为8。 一些代码
的法宝大多只是简单的GDI的东西。这里的真正实力是在结构组件是如何安排的,以及它们如何控制传递给其他组件的矩形。然而,有几个可能是有趣的事情要注意。PropertiesChanged活动
下面是用来方便访问的PropertiesChanged事件,以避免注册一个监听不止一次。也许对我的一个小懒惰,但它避免了在长期运行的问题。互相交谈的许多组成部分,我想确保我是不重复不必要的重绘或其他函数调用。

private EventHandler onPropertiesChanged;

/// <summary></summary>

public event EventHandler PropertiesChanged {

    add {

        if (onPropertiesChanged != null) {

            foreach (Delegate d in onPropertiesChanged.GetInvocationList()) {

                if (object.ReferenceEquals(d, value)) { return; }

            }

        }

        onPropertiesChanged = (EventHandler)Delegate.Combine(onPropertiesChanged, value);

    }

    remove { onPropertiesChanged = (EventHandler)Delegate.Remove

                (onPropertiesChanged, value); }

}
使用的DualProgressBar
双进度条的概念是大多数人都用于工作与有所不同。为了帮助理解它在做什么,下面的代码是用于演示程序DualTests的形式。它套到10000主最大,到2000年的最大(因为我知道未来的时间,我想五次迭代)。然后,它循环五次,重置价值的财产,和增量的价值和MasterValue属性。此示例演示如何双进度条,可用于显示与个人进步的总体进度。{C}
虽然主进度股份非主进步的最低值,通过MasterMaximum和MasterValue属性,它的行为就像任何其他的进展。要注意的
IGlossPainter的继承属性并测试,以确保你没有设置光泽作为自己的接班人,但它没有一个较大的参考回路测试。由于每个光泽要求其继任者(如果不为null)重绘本身,光泽引用循环将导致无限重绘循环。由于这是发生在设计时,Visual Studio将死去,如果你这样做。如果有人有这样的参照循环测试的建议,我喜欢听到这种说法。使用的组件
首先,您将要删除的表单上的进度条之一(ProgressBarEx,DualProgressBar,或RarProgressBar),然后还可以添加背景画家,边境画家,和进展画家表单,以及与任何光泽实例您可能需要。
一旦你已经添加的组件,ProgressPainter,BorderPainter,和你的进度条的BackgroundPainter属性设置相应的组件。
然后,如果你添加掩盖的形式,你可以设置你的其他画家GlossPainter属性。每个光泽画家可以在多个组件中使用过,这样的背景和进展画家可以共享光泽。
,如果你想链掩盖起来,你想每一个链的继任属性设置中的每一个链中的下。只要记住他们画的顺序,而串连起来。此外,请记住,你必须避免的结果,光泽引用本身在其链的任何地方,这将导致无限重绘循环,将杀死的Visual Studio链。结论
这个项目是为了好玩,而我很少有疑问,还存在有一些错误。我没有在GDI或自定义控件的专家,所以有可能很多改善这里的空间,我很想听到你那些有更多比我的专业知识(甚至那些没有)的建议。但是,它的功能,它使得一些不错的,多功能的酒吧。下面是在开发和测试中创造了一些例子。正如你可以看到,有很多与这些组件的可能性。
左边的例子,与普通的控制和光泽。右边的例子进行了具体的画家,与非WINRAR双酒吧,这一切均与平原的画家和光泽的例外。未来计划切片的进度条,以利于标准的Windows酒吧,我想补充一点。我也想四舍五入边界和酒吧提供更多的选择。,当然,我也想找到解决的局限性上述(可变宽度的边界,与基于图像的酒吧的填充问题,等等)。历史12/19/2008初始发行2008年12月23日建议,已更新的后续访问ChainedGlossPainter更好地检测到循环引用。此外,此更新包括跑马灯酒吧的功能。 AbstractProgressBar类有4个新的属性:ProgressType,MarqueeSpeed​​,MarqueeStep放大器; MarqueePercentage"(我会尽力在以后的时间更新图)。 ProgressType是平滑的值(正常)的枚举,MarqueeWrap(运行线架的权利,然后回帧从左至右),MarqueeBounce(左,右之间反弹)放大器; MarqueeBounceDeep(也反弹,但超出框架前篮板)。速度是一个int更新之间的毫秒。 STEP是一个int像素之间移动更新。而MarqueePercentage决定字幕栏的宽度。AbstractProgressBar还包括选取框功能,这是在ProgressBarEx实施的三个抽象方法:MarqueeStart(),MarqueePause()放大器; MarqueeStop()。我从来不喜欢默认的进度条如何处理选取框操作,看到很多人困惑和/或抱怨。所以我决定使用方法启动和停止动画。由于DualProgressBar延伸ProgressBarEx,它继承了这一功能。而且你还可以使用主进度正常。这可能会派上用场,如果你有长期的业务,你想显示的实际进展,但仍然在等待动画。这scenation是在新的跑马灯测试形式模拟。只是要确保设置PaintMasterFirst属性设置为true。

我不知道,我这个实现完全满意,但它建立一个可用此功能的接口,而且它似乎工作不够好(BarberPoleProgressPainter放大器显着的例外; CandyCaneProgressPainter,不正确的行为,由于前面提到的限制)。2009年1月18日ProgressType枚举有一个新的价值动画。IAnimatedProgressPainter接口。ProgressBarEx.ProgressPainter财产,现在一些被设置时的验证。 ProgressType.Animated价值是唯一有效的ProgressBarEx.ProgressPainter是一个IAnimatedProgressPainter实例。 ProgressType,如果一个非动画的进步画家分配ProgressBarEx.ProgressPainter,它目前拥有ProgressType.Animated价值,将改为ProgressType.Smooth。如果ProgressBarEx.ProgressType设置为ProgressType.Animated而ProgressBarEx.ProgressPainter设置为一个非动画的进步画家,将抛出一个ArgumentException。ProgressBarEx有两个新的方法,StartAnimation()和StopAnimation()。它管理一个内部定时器,它使用的MarqueeSpeed​​更新动画。动画时,它设置的这动画的进步画家的动画属性,那么它定时器回调方法只是无效的控制到被粉刷一新(的动画片实现更新内部变量来跟踪成帧,如果它是动画属性是虚假的,它并没有使用帧计数器)。添加的类
有两个新的进展画家实现IAnimatedProgressPainter:StripedProgressPainter和WaveProgressPainter。 StripedProgressPainter是在外观上的BarberPoleProgressPainter非常相似,但它不同意,因为它使用的填充限制,而不是画一个移动的图像GraphicsPaths。它还允许您设置两种颜色。 WaveProgressPainter是类似的功能,但它使用Bezier曲线,而不是条纹。 (实际上,我一点点失望波画家,它不是很冷静,因为我认为这将是,也许你可以用它做更多,也许你会喜欢比我更没有)演示设置的进展酒吧的Value属性的最大显示动画,但是这不是必需的。
要使用的动画,所有你要做的使用ProgressBarEx.StartAnimation()和ProgressBarEx.StopAnimation()方法。如果一个非动画的进步画家是目前的进度画家,这些方法与无能为力。

回答

评论会员:mmjc23 时间:2011/12/28
神奇的ProgressBar
但是,我可以直接垂直?
感谢
评论会员:BoneSoft 时间:2011/12/28
大概是我在这个项目中最大的失败是不加入他们能够做到垂直。我希望有一天它添加到项目,以及其他一些东西。但它不会可能会很快。在此期间,我只能说是遗憾。
using (Tallica.Heroes h = new Tallica.Heroes()) {

    h.BackTo(theFront);

}

评论会员:mmjc23 时间:2011/12/28
喜bonesoft
感谢您响应
您发布的代码是什么?
我应该改变原有的控制代码,我声明在这样一个新的对象
评论会员:?BoneSoft 时间:2011/12/28
对不起,这只是我的自动信号。 Metallica的可支配的英雄。
using (Tallica.Heroes h = new Tallica.Heroes()) {

    h.BackTo(theFront);

}

评论会员:dherrmann 时间:2011/12/28
您好,
都试过主机在一个ToolStrip控制?

问候
迪特里希
评论会员:BoneSoft 时间:2011/12/28
我没有。
我不知道,如果别人。
using (Tallica.Heroes h = new Tallica.Heroes()) {

    h.BackTo(theFront);

}

评论会员:曼努埃尔ALE 时间:2011/12/28
好文章
评论会员:BoneSoft 时间:2011/12/28
滚动一个的TrackBar一个值到dualprogressbar,问题是,dualprogressbar始终在2号开始!。如果我做反,减的TrackBar的价值,从最大的TrackBar值必须是2进度开始。你能帮助我。这里是图像链接:"http://img14.imageshack.us/i/dualprogressbar.jpg"
评论会员:曼努埃尔ALE 时间:2011/12/28
对不起,我不明白的问题是什么。你能解释一下在你在做什么,和什么进度条与你所期望它做的事情做进一步的细节吗?
我想帮助,但我不太得到您的方案。"政治正确性是一种学说,妄想,不合逻辑的少数培育,rabidly一个无良的主流媒体,拥有提出的命题,这是完全有可能拿起一个粪,清洁结束推广" - 未知
: | dherrmann
评论会员:游客 时间:2011/12/28
我有一些值是由trackbars给予dualprogressbars,主值保持固定的指标。他们都对,之一运行由左到右,由右至左。我已经设置了所有的最大值10。问题是,progressbars开始表明,只有当trackbars为从右到左的值是2的TrackBar设置为1左到右的时总是显示2,1号是跳过。你有什么想法什么错
?BoneSoft
评论会员:游客 时间:2011/12/28
您好,我试图用下你的DLLVB.net。我可以构造一个进度BarberPoleProgressPainter但它不会开始动画。我有一个SplashScreen形式的控制。然后我试图使用StripedProgressPainter,但这个组件,我不能把我的形式......不知道为什么......你对我的一些想法,好吗?我真的想用你出色的控制!关于迪特里希
dherrmann
评论会员:游客 时间:2011/12/28
ProgressBarEx有两种方法涉及到动画:StartAnimation()和StopAnimation()(没有做任何事情,如果进展画家不喜欢StripedProgressPainter和WaveProgressPainterIAnimatedProgressPainter实施)。你调用的StartAnimation方法吗?如果是的话,请检查您使用的进展画家。在测试项目中,有一个名为MarqueeTest形式,如何构造和使用动画画家(MarqueeTest.cs线75-93,反正在我的本地副本)的例子。希望有帮助,让我知道如果你仍然有问题得到它的工作。imgsrc=http://www.orcode.com/upimg/2011_12_28_07_31_24_55.gif"政治上的正确性是一种学说,妄想,不合逻辑的少数培育,rabidly一个无良的主流媒体,拥有提出的命题,这是完全有可能拿起一个粪,清洁结束推广"-未知:|DrABELL
!感谢您的回答BR}同时,我得到了它运行的部分(我couldnt尝试所有版本...).{ BR}
我用RoundGlossPainter,PlainBackgroundPainter和RarBorderPainter StripedProgressPainter,它与StartAnimation。
我BarberPoleProgressPainter或WaveProgressPainter太多,但没有效果,就没有动力。
关于
迪特里希| Fishbox:
评论会员:游客 时间:2011/12/28
华丽的文章,在各个方面的优秀项目,坚实的代码基地:公司5
!BoneSoft
评论会员:游客 时间:2011/12/28
很坦率的最佳记录,极大地通用,认真掌握失控那里进度条
!deaddog4201
评论会员:游客 时间:2011/12/28
哇,这很可能是我曾经得到的最好的赞美。感谢imgsrc=http://www.orcode.com/upimg/2011_12_28_07_31_24_56.gif"政治上的正确性是一种学说,妄想,不合逻辑的少数培育,rabidly一个无良的主流媒体,拥有提出的命题,这是完全有可能拿起一个粪,清洁结束推广"-未知:|Vercas
多德这是伟大的控制生病的感谢!尼斯描述性的文章,以及
评论会员:。Vercas 时间:2011/12/28
这是纯粹的真棒
评论会员:BoneSoft 时间:2011/12/28
谢谢你这么多的本文和相关的控制
当然,我在我的程序之一中使用双进度条。,

我这5 / 5评级为迷死人!

我想告诉你为什么我用这几个原因:
非常定制!
双进步为赢!
即刻与Windows进度条绘制。至少对我来说,它更新缓慢,我有一种感觉,到年底前达到增加它的长度,等待字幕晚霞。微软控件接受...

无论如何,感谢你一百万次
评论会员:。Vercas 时间:2011/12/28
我很高兴你喜欢它。我希望,它的工作原理以及为您。
"政治上的正确性是一种学说,妄想,不合逻辑的少数培育,rabidly一个无良的主流媒体,拥有提出的命题,这是完全有可能拿起一个粪,清洁结束推广" - 未知
: | BoneSoft
评论会员:游客 时间:2011/12/28
到目前为止,它的工作原理正如我需要。完美无瑕!好了,除了一个渲染器组件...但我忘了哪一个是我不需要使用也无妨。imgsrc=http://www.orcode.com/upimg/2011_12_28_07_31_24_55.gifJavaProgressPainter类似乎符合我的需求。真棒的工作!imgsrc=http://www.orcode.com/upimg/2011_12_28_07_31_24_59.gif
Vercas
评论会员:游客 时间:2011/12/28
Java是我个人的最爱之一。我知道动画的填充问题时,他们。但是,他们的小问题。我很高兴为您工作。imgsrc=http://www.orcode.com/upimg/2011_12_28_07_31_24_56.gif"政治上的正确性是一种学说,妄想,不合逻辑的少数培育,rabidly一个无良的主流媒体,拥有提出的命题,这是完全有可能拿起一个粪,清洁结束推广"-未知:|KamranBehzad
首先,我认为有关使用前景栏的背景栏理发栏的直板...但它需要很多的表现,这不是一个更新程序的好事。
哦,是啊,我使用的负填充填补了吧。它会看起来很糟糕的0填充
评论会员:。BoneSoft 时间:2011/12/28
爱这个组件对于所有的读者:有与Maximum属性的设置及其相关的设置,可以使此组件不可用只有轻微的问题,如果您的最高低于100,特别是较低的值(例如低于10)。
我相信作者会同意,他所有对他的最大值100测试。因此,以下的错误会被人们忽视。我指出,在较早发布的两个错误。但对于那些喜欢使用此组件ASAP,我列出了所有的错误,我发现和改正,作者是无法更新的源代码。随着所有这些更正似乎是为我工作完美。

注:
以下五宗个案中有两个明显的错误。其他的都告诉我,他们必须为一个特定的目的和原因有由原作者1或-1的处理。但我不能看到是什么原因和消除这些在我的测试中正确显示的结果。

所以,注意事项:享受
1)
文件:AbstractProgressBar.cs
性质:公共int值
行:11
原代码:
int percent = (int)(((float)this.value / (float)(this.maximum - 1f)) * 100f);
更正:
int percent = (int)(((float)this.value / (float)(this.maximum)) * 100f);

[效果:百分比显示不正确。一个10步的过程如步骤2应显示20%= 2 / 10,但显示22%= 2 / 9]
2)
文件:DualProgressBar.cs
物业:公共覆盖int最大
线:7
原代码:
mastermax = value;
更正:删除原代码

[效果:从进程的最大价值是分配给主进程的最大价值。如果两者都相同(如100),被认为是没有效果。但不同的时候,它会导致完全错误的显示。使DualProgressBar无用。]
3)
文件:ProgressBarEx.cs
方法:保护覆盖无效ResizeProgress()
行:10
原代码:
if (val > 0) { val++; }
更正:删除原代码

[效果:百分比显示不正确。例如,3步过程的第1步应显示33%= 1 / 3,但显示67%= 2 / 3]
从以前的帖子:
文件:DualProgressBar.cs
方法:私人无效ResizeMasterProgress()
线:9
原代码:
if (val > 0) { val++; }
更正:删除原代码

[效果:百分比显示不正确。例如,3步过程的第1步应显示33%= 1 / 3,但显示67%= 2 / 3]

5)
文件:DualProgressBar.cs
方法:私人无效ResizeMasterProgress()
行:11
原代码:
if (value >= mastermax && mastermax > 0)
更正:
if (val >= mastermax && mastermax > 0)

[效果:与奴隶价值,而不是不可预知的百分比主栏上显示的主值结果的不正确的比较]
关于
卡姆兰Behzad