前2天在网上找到一个很有意思的进度条控件,拿出来给大家分享一下,顺便记录一下自己的学习心得。
先截个图看看效果:
由于项目需要,要在复杂的执行中给用户展示执行进度,难免的就会涉及到进度条。在codeproject上面看到一个叫Progress-O-Doom的进度条控件,看了一下觉得蛮有意思的,就下了个回来研究了一下。发现它的进度条都是由一些子控件绘画出来的,包括专门画边框的,专门画滚动条背景的,专门画滚动条的。好像是把一个进度条分解成了好几个东西去分别绘制,而且有些是可以自由组合的,最终组合而成的进度条可以有多种效果,可以自己试验一下,考验想象力的时候到了。
除了最基本的ProgressBarEx这个控件之外,还有几种内置的滚动条控件,包括Rar样式的RarProgressBar、包含二层滚动条的DualProgressBar.跑按照作者的设计的话其实是只需要一个ProgressBarEx,再加上一些ProgressPainter,BackgroundPainter,BorderPainter,就可以组合出很酷的进度条。其中ProgressPainter也可以单独设置自己的GlossPainter和BorderPainter属性,而BackgroundPainter也是可以设置它的GlossPainter属性的,就这种灵活的组合,很方便,而且作者都是有可视化界面的,拖拖拽拽,点点鼠标设置一下,就可以弄一个很酷的进度条出来。
用一个DualProgressBar就可以解决我项目的需求,因为我有二层的for循环,第一层的滚动条显示外层的循环,第二层的滚动条显示里层的循环,蛮好的。
先在窗体上面放置一个DualProgressBar,这个类型的滚动条需要4个Painter去描绘, ,所以可以再分别在窗体上面选择对应类型的Painter,然后分别设置好Painter的属性,主要是颜色类和样式类,有的还涉及到二种颜色,有的样式可以设置为突出或是凹进去或者和窗体平齐,3D效果之类的。其实像这个进度条设置一下MasterValue和Value就可以在设计的时候看出它其实是二个进度条的组合了。这里MasterPainter和ProgressPainter要设置成2个不一样的ProgressPainter,至少要颜色不一样才能看得到是二个在同时滚动嘛。
后台代码的使用也是比较简单的,主要就是对MasterValue和Value赋值就可以了。设置2个参数,第一个是第一层的循环次数,第二个参数是第二层循环的次数。
/// <summary>
/// Shows the progress.
/// </summary>
/// <param name="firstLoop">The first loop count.</param>
/// <param name="secondLoop">The second loop count.</param>
private void ShowProgress(int firstLoop, int secondLoop){dualProgressBar1.Value = 0;dualProgressBar1.MasterValue = 0;dualProgressBar1.Maximum = secondLoop;dualProgressBar1.MasterMaximum = firstLoop * secondLoop;for (int i = 0; i < firstLoop; i++){dualProgressBar1.Value = 0;for (int j = 0; j < secondLoop; j++){dualProgressBar1.Value = j;dualProgressBar1.MasterValue++;Application.DoEvents();}}dualProgressBar1.Value = 0;dualProgressBar1.MasterValue = 0;}
效果还是不错的,有兴趣的话可以自己试一下的。
我提供一个原作者提供的Demo,可以先看看效果,觉得不错再去原地址去下载代码。
有英文版的介绍,我讲的都是自己的想法,不够详细,可能没作者介绍的那么完整,英文好的看看原版吧。
http://www.codeproject.com/KB/progress/ProgressODoom.aspx