这个控件太傻瓜了,只搁在博客里算了。日前需要用到一个载入条,
但不想找GIF图片,.NET里面没有提供这个控件,只有ProgressBar。自己写吧!要写也不难,就是周期性绘制一个长方形,让那个长方形不停地向右移动。这个周期性的操作可以开一条线程Thread。我就用了一个WinForm的控件Timer
用到了GDI+,重写OnPaint方法是免不了的。
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rec=new Rectangle((int)(curLen - this.Width * barLength), , (int)(this.Width * barLength), this.Height - );
if (Application.RenderWithVisualStyles)
{
VisualStyleRenderer glyphRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
glyphRenderer.DrawBackground(e.Graphics, rec);
}
else
e.Graphics.FillRectangle(Brushes.Green, rec); e.Graphics.DrawRectangle(Pens.Black, , , this.Width-, this.Height-); }
自从上次写了那个可分租的GroupGridView之后,学多了一样东西,利用VisualStyleRenderer这个类的就可以使用上系统上的三维效果。
在Timer控件的Tick事件绑定以下方法,
private void timer1_Tick(object sender, EventArgs e)
{
if (!this.DesignMode)
{
curLen += ;
if (curLen >= this.Width * ( + barLength)) curLen = ;
this.Refresh();
}
}
那个DesignMode就是判断是否在视图设计器上显示,如果不加那个判断,编译控件之后,拉到窗体里面,那Loading的效果也能看出来,这属性找了很久都没找到,感谢匡哥告诉我。其他也没什么好说的,上图上代码
由于是Win8的,看不到什么三维效果了。
class LoadingBar:Control
{ private System.Windows.Forms.Timer timer1;
private System.ComponentModel.IContainer components; private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// timer1
//
this.timer1.Enabled = true;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
this.ResumeLayout(false); curLen = ;
barLength = 0.5f;
} internal float curLen;
internal float barLength; public LoadingBar()
{
InitializeComponent();
} private void timer1_Tick(object sender, EventArgs e)
{
if (!this.DesignMode)
{
curLen += ;
if (curLen >= this.Width * ( + barLength)) curLen = ;
this.Refresh();
}
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e); Rectangle rec=new Rectangle((int)(curLen - this.Width * barLength), , (int)(this.Width * barLength), this.Height - );
if (Application.RenderWithVisualStyles)
{
VisualStyleRenderer glyphRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Chunk.Normal);
glyphRenderer.DrawBackground(e.Graphics, rec);
}
else
e.Graphics.FillRectangle(Brushes.Green, rec); e.Graphics.DrawRectangle(Pens.Black, , , this.Width-, this.Height-); }
}
LoadingBar