载入条LoadingBar

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

载入条LoadingBar

但不想找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的效果也能看出来,这属性找了很久都没找到,感谢匡哥告诉我。其他也没什么好说的,上图上代码

载入条LoadingBar

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

载入条LoadingBar
 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

 

你可能感兴趣的:(load)