C#winform做了个form,进度条progressbar风格是marquee,可随时更新此form上Label控件显示的信息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#winform做了个form,进度条progressbar风格是marquee,可随时更新此form上Label控件显示的信息相关的知识,希望对你有一定的参考价值。
这个form需要定义一个属性,要求实例化这个form后,给此属性赋一个字符串,form上的label显示的信息就立即更新(显示赋予的这个字符串),而且进度条要是多线程的(单线程的执行海量任务时进度条会卡住不动),progressbar一直是来回闪动就好,不做其他处理,望大神解决!
private void button3_Click(object sender, EventArgs e)Thread t = new Thread(() =>
//调用控件的invoke函数,表示里面代码将会异步到拥有该控件的线程里执行。
this.progressBar1.Invoke(new Action<int>(a=>
this.progressBar1.Value=a;
),80);//80是传递给Invoke()的参数,在这里表示进度条达到的长度
);
t.Start();
追问
progressBar不需要做任何处理啊,最关键的是我想随时更新label显示的信息,这个form需要定义一个属性,要求实例化这个form后,给此属性赋一个字符串,form上的label显示的信息就立即更新(显示赋予的这个字符串)!!主要是为了实现这个
追答道理是一样的。创建新线程,调用控件的Invoke函数。
我把函数拆开来写。清晰一点。
你自己改一下button click函数里面的for循环那部分,改成你自己想要的赋值方式。
private void button4_Click(object sender, EventArgs e)Thread t = new Thread(() =>
for (int i = 0; i < 11190; i++)
Change(i.ToString());
);
t.Start();
public void UpdateLabel(string msg)
this.label1.Text = msg;
public void Change(string str)
Thread t = new Thread(() =>
this.label1.Invoke(new Action<string>(UpdateLabel),str);
);
t.Start();
参考技术A 你可以单独开个线程给进度条!本回答被提问者采纳
仿苹果AppStore 下载进度条
以前项目自己写的 ,一个模仿苹果AppStore 下载进度条的winfrom用户控件,GDI绘制。效果如图
1 using System.Drawing; 2 using System.Windows.Forms; 3 using System.ComponentModel; 4 namespace test 5 { 6 public class CircleProgressBar : Control 7 { 8 float _progress = 0F; 9 float _Wpen = 1; 10 float _Npen = 5; 11 float _Fwidth = 10; 12 [Description("进度条颜色")] 13 public Color CircleColor 14 { 15 get; 16 set; 17 } 18 [Description("外圈粗度")] 19 public float WpenThin 20 { 21 get { return _Wpen; } 22 set { _Wpen = value; } 23 } 24 [Description("内圈粗度")] 25 public float NpenThin 26 { 27 get { return _Npen; } 28 set { _Npen = value; } 29 } 30 [Description("内心方形边长")] 31 public float Fwitdh 32 { 33 get { return _Fwidth; } 34 set { _Fwidth = value; } 35 } 36 public void PaintProgress(PaintEventArgs e) 37 { 38 float x = this.Width / 2; 39 float y = this.Height / 2;//圆心坐标 40 float Wr = x - WpenThin / 2;//外圈半径 41 float Nr = x - NpenThin / 2;//内圈半径 42 int Wx = (int)(x - Wr); 43 int Wy = (int)(y - Wr);//外圈起始坐标 44 int Nx = (int)(x - Nr); 45 int Ny = (int)(y - Nr);//外圈起始坐标 46 int Fy = (int)(y - Fwitdh/2); 47 int Fx = (int)(x - Fwitdh/2);// 内心方形坐标 48 Graphics dc = this.CreateGraphics(); 49 dc.Clear(this.BackColor); 50 Pen Wpen = new Pen(CircleColor, WpenThin); 51 Pen Npen = new Pen(CircleColor, NpenThin); 52 Brush Fbrush = new SolidBrush(CircleColor); 53 dc.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 54 float startAngle = -90; 55 float sweepAngle = Progress / 100 * 360;//起始角度 56 Rectangle Wrec = new Rectangle(Wx, Wy, 2 * (int)Wr, 2 * (int)Wr); 57 Rectangle Nrec = new Rectangle(Nx, Ny, 2 * (int)Nr, 2 * (int)Nr); 58 Rectangle Frec = new Rectangle(Fx, Fy, (int)Fwitdh, (int)Fwitdh); 59 dc.DrawEllipse(Wpen, Wrec); 60 dc.FillRectangle(Fbrush, Frec); 61 dc.DrawArc(Npen, Nrec, startAngle, sweepAngle); 62 } 63 public float Progress 64 { 65 get { return _progress; } 66 set 67 { 68 if (_progress != value && value >= 0 && value <= 100) 69 { 70 _progress = value; 71 OnProgressChanged(); 72 } 73 } 74 } 75 protected virtual void OnProgressChanged() 76 { 77 this.Invalidate(); 78 } 79 protected override void OnPaint(PaintEventArgs e) 80 { 81 PaintProgress(e); 82 base.OnPaint(e); 83 } 84 } 85 }
以上是关于C#winform做了个form,进度条progressbar风格是marquee,可随时更新此form上Label控件显示的信息的主要内容,如果未能解决你的问题,请参考以下文章