c# progressBar进度条改变颜色及显示进度数字

近段时间公司一个项目需要做一项功能,显示一个操作的进度条。按照客户的要求需要设置特定的前景及背景颜色,但是c#工具自带的控件progressBar不支持属性里面直接设置前景及背景颜色,并且不能显示进度的百分比。于是百度了一通加上自己的研究探索,总算是把客户要求的功能做出来了,这里和大家分享一下,共同探讨。

下面说说该功能的具体实现:
一、改变进度条的颜色
因属性里面不能直接设置,首先考虑的是在Prograssbar上面放一个label,然后设置label的Parent为prograssbar,这种方法确实实现了颜色的改变,但是进度条看不到了,该方法以失败告终。然后一通百度发现可以通过重写Prograssbar的OnPaint方法来解决,代码如下:
public class MyProgressBar : ProgressBar
        {
            public MyProgressBar()
            {
                base.SetStyle(ControlStyles.UserPaint, true);
            }

            //重写OnPaint方法
            protected override void OnPaint(PaintEventArgs e)
            {
                SolidBrush brush = null;
                Rectangle bounds = new Rectangle(0, 0, base.Width, base.Height);
                //...
                //e.Graphics.FillRectangle(new SolidBrush(this.BackColor), 1, 1, bounds.Width, bounds.Height);
                bounds.Height -= 4;
                bounds.Width = ((int)(bounds.Width * (((double)base.Value) / ((double)base.Maximum)))) - 4;
                brush = new SolidBrush(Color.Coral);
                e.Graphics.FillRectangle(brush, 2, 2, bounds.Width, bounds.Height);

                
            }
        }

2、然后设置设置自定义的MyPrograssbar为拖到界面的Prograssbar1的子控件,然后继续绘制可以看到效果,代码如下:

private void button2_Click(object sender, EventArgs e)
        {
            MyProgressBar cp = new MyProgressBar();
            cp.Parent = progressBar1;
            cp.Minimum = 0;//进度条显示最小值
            cp.Maximum = 100;//进度条显示最大值
            cp.Width = progressBar1.Width;
            cp.Height = progressBar1.Height;
            cp.BackColor = Color.BlueViolet;
            //Label l = new Label();
            //l.Parent = cp;
            //l.BackColor = Color.Transparent;
            //l.ForeColor = Color.Red;
            //l.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            //l.Width = cp.Width;
            //l.Height = cp.Height;

            for (int i = 0; i < 100; i++)
            {

                Thread.Sleep(100);
                cp.Value = i + 1;

                textEdit1.Text = i.ToString();
                textEdit2.Text = (i + 2).ToString();
                //SetProcessValue("aa", i + 1);
                //Font font = new Font("宋体", (float)16, FontStyle.Regular);
                //PointF pt = new PointF(cp.Width / 2 - 10, cp.Height / 2 - 13);
                //cp.CreateGraphics().DrawString(i.ToString(), font, Brushes.Red, pt);
                //l.Text = i.ToString();
                Application.DoEvents();
            }
        }

运行效果如下:

Cprogress cprogressbar显示数值_Text

这样进度条的颜色就可以实现了,其实就是重新绘制就可以了,这个控件的颜色在基础的控件里面也就是画上去的,只是他做的不是很强大,不支持进度条颜色的改变。
 
 二、这里实现了进度条颜色的改变后再来考虑进度百分比的加入。因为有前面的基础,这里首先想到的就是给他画上去,代码如下:
Font font = new Font("宋体", (float)16, FontStyle.Regular);
                PointF pt = new PointF(cp.Width / 2 - 10, cp.Height / 2 - 13);
                cp.CreateGraphics().DrawString(i.ToString(), font, Brushes.Red, pt);

效果如下图:

Cprogress cprogressbar显示数值_进度条_02

这里可以实现,进度显示,但是到后面发现闪烁特别严重,到后面直接就看不到了,想了很多办法始终无法解决这个问题,但是那几个记录进度的文本框却没什么影响,于是灵机一动想到既然控件不会闪烁那么可以尝试用lable记录进度看看效果,于是修改代码如下:

private void button2_Click(object sender, EventArgs e)
        {
            MyProgressBar cp = new MyProgressBar();
            cp.Parent = progressBar1;
            cp.Minimum = 0;//进度条显示最小值
            cp.Maximum = 100;//进度条显示最大值
            cp.Width = progressBar1.Width;
            cp.Height = progressBar1.Height;
            cp.BackColor = Color.BlueViolet;
            Label l = new Label();
            l.Parent = cp;
            l.BackColor = Color.Transparent;
            l.ForeColor = Color.Red;
            l.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            l.Width = cp.Width;
            l.Height = cp.Height;

            for (int i = 0; i < 100; i++)
            {

                Thread.Sleep(100);
                cp.Value = i + 1;

                textEdit1.Text = i.ToString();
                textEdit2.Text = (i + 2).ToString();
                //SetProcessValue("aa", i + 1);
                //Font font = new Font("宋体", (float)16, FontStyle.Regular);
                //PointF pt = new PointF(cp.Width / 2 - 10, cp.Height / 2 - 13);
                //cp.CreateGraphics().DrawString(i.ToString(), font, Brushes.Red, pt);
                l.Text = i.ToString();
                Application.DoEvents();
            }
        }

运行程序发现问题得到完美解决,效过如下图:

Cprogress cprogressbar显示数值_进度条_03