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.youkuaiyun.com/download/czcl123/10832214