这个控件太傻瓜了,只搁在博客里算了。日前需要用到一个载入条,
但不想找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 else11 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 // timer114 // 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 else52 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 }