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();
        }
    }

运行效果如下:
在这里插入图片描述

这样进度条的颜色就可以实现了,其实就是重新绘制就可以了,这个控件的颜色在基础的控件里面也就是画上去的,只是他做的不是很强大,不支持进度条颜色的改变。

二、这里实现了进度条颜色的改变后再来考虑进度百分比的加入。因为有前面的基础,这里首先想到的就是给他画上去,代码如下:

            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);

效果如下图:

在这里插入图片描述
这里可以实现,进度显示,但是到后面发现闪烁特别严重,到后面直接就看不到了,想了很多办法始终无法解决这个问题,但是那几个记录进度的文本框却没什么影响,于是灵机一动想到既然控件不会闪烁那么可以尝试用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();
        }
    }

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

在这里插入图片描述
代码附上,相互交流。
https://download.csdn.net/download/czcl123/10832214
————————————————
版权声明:本文为CSDN博主「czcl123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/czcl123/article/details/72782961

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值