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控件显示的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WinForms 进度条?

c#winform,关于进度条当前进度的计算。求助,大侠进,在线等...

Xamarin。 WebView Progres

仿苹果AppStore 下载进度条

winform进度条实现

重写C# winform 进度条的样式(要代码示例)