首页 > 技术文章 > 载入条LoadingBar

HopeGi 2013-10-14 19:39 原文

  这个控件太傻瓜了,只搁在博客里算了。日前需要用到一个载入条,

但不想找GIF图片,.NET里面没有提供这个控件,只有ProgressBar。自己写吧!要写也不难,就是周期性绘制一个长方形,让那个长方形不停地向右移动。这个周期性的操作可以开一条线程Thread。我就用了一个WinForm的控件Timer

  用到了GDI+,重写OnPaint方法是免不了的。

 1         protected override void OnPaint(PaintEventArgs e)
 2         {
 3             base.OnPaint(e);
 4             Rectangle rec=new Rectangle((int)(curLen - this.Width * barLength), 1, (int)(this.Width * barLength), this.Height - 2);
 5             if (Application.RenderWithVisualStyles)
 6             {
 7                 VisualStyleRenderer glyphRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
 8                 glyphRenderer.DrawBackground(e.Graphics, rec);
 9             }
10             else
11                 e.Graphics.FillRectangle(Brushes.Green, rec);
12 
13             e.Graphics.DrawRectangle(Pens.Black, 0, 0, this.Width-1, this.Height-1);
14 
15 
16         }

自从上次写了那个可分租的GroupGridView之后,学多了一样东西,利用VisualStyleRenderer这个类的就可以使用上系统上的三维效果。

在Timer控件的Tick事件绑定以下方法,

1         private void timer1_Tick(object sender, EventArgs e)
2         {
3             if (!this.DesignMode)
4             {
5                 curLen += 10;
6                 if (curLen >= this.Width * (1 + barLength)) curLen = 0;
7                 this.Refresh();
8             }
9         }

那个DesignMode就是判断是否在视图设计器上显示,如果不加那个判断,编译控件之后,拉到窗体里面,那Loading的效果也能看出来,这属性找了很久都没找到,感谢匡哥告诉我。其他也没什么好说的,上图上代码

由于是Win8的,看不到什么三维效果了。

 1     class LoadingBar:Control
 2     {
 3 
 4         private System.Windows.Forms.Timer timer1;
 5         private System.ComponentModel.IContainer components;
 6 
 7         private void InitializeComponent()
 8         {
 9             this.components = new System.ComponentModel.Container();
10             this.timer1 = new System.Windows.Forms.Timer(this.components);
11             this.SuspendLayout();
12             // 
13             // timer1
14             // 
15             this.timer1.Enabled = true;
16             this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
17             this.ResumeLayout(false);
18 
19             curLen = 0;
20             barLength = 0.5f;      
21         }
22 
23         internal float curLen;
24         internal float barLength;
25 
26         public LoadingBar()
27         {
28             InitializeComponent();
29         }
30 
31         private void timer1_Tick(object sender, EventArgs e)
32         {
33             if (!this.DesignMode)
34             {
35                 curLen += 10;
36                 if (curLen >= this.Width * (1 + barLength)) curLen = 0;
37                 this.Refresh();
38             }
39         }
40 
41         protected override void OnPaint(PaintEventArgs e)
42         {
43             base.OnPaint(e);
44 
45             Rectangle rec=new Rectangle((int)(curLen - this.Width * barLength), 1, (int)(this.Width * barLength), this.Height - 2);
46             if (Application.RenderWithVisualStyles)
47             {
48                 VisualStyleRenderer glyphRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
49                 glyphRenderer.DrawBackground(e.Graphics, rec);
50             }
51             else
52                 e.Graphics.FillRectangle(Brushes.Green, rec);
53 
54             e.Graphics.DrawRectangle(Pens.Black, 0, 0, this.Width-1, this.Height-1);
55 
56 
57         }
58     }
LoadingBar

 

推荐阅读