重写C# winform 进度条的样式(要代码示例)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写C# winform 进度条的样式(要代码示例)相关的知识,希望对你有一定的参考价值。
重写C# winform 进度条的样式,需要上面的进度条样式,要代码示例谢谢
int min = 0; // Minimum value for progress rangeint max = 100; // Maximum value for progress range
int val = 0; // Current progress
Color BarColor = Color.Blue; // Color of progress meter
protected override void OnResize(EventArgs e)
// Invalidate the control to get a repaint.
this.Invalidate();
protected override void OnPaint(PaintEventArgs e)
Graphics g = e.Graphics;
SolidBrush brush = new SolidBrush(BarColor);
float percent = (float)(val - min) / (float)(max - min);
Rectangle rect = this.ClientRectangle;
// Calculate area for drawing the progress.
rect.Width = (int)((float)rect.Width * percent);
// Draw the progress meter.
g.FillRectangle(brush, rect);
// Draw a three-dimensional border around the control.
Draw3DBorder(g);
// Clean up.
brush.Dispose();
g.Dispose();
public int Minimum
get
return min;
set
// Prevent a negative value.
if (value < 0)
min = 0;
// Make sure that the minimum value is never set higher than the maximum value.
if (value > max)
min = value;
min = value;
// Ensure value is still in range
if (val < min)
val = min;
// Invalidate the control to get a repaint.
this.Invalidate();
public int Maximum
get
return max;
set
// Make sure that the maximum value is never set lower than the minimum value.
if (value < min)
min = value;
max = value;
// Make sure that value is still in range.
if (val > max)
val = max;
// Invalidate the control to get a repaint.
this.Invalidate();
public int Value
get
return val;
set
int oldValue = val;
// Make sure that the value does not stray outside the valid range.
if (value < min)
val = min;
else if (value > max)
val = max;
else
val = value;
// Invalidate only the changed area.
float percent;
Rectangle newValueRect = this.ClientRectangle;
Rectangle oldValueRect = this.ClientRectangle;
// Use a new value to calculate the rectangle for progress.
percent = (float)(val - min) / (float)(max - min);
newValueRect.Width = (int)((float)newValueRect.Width * percent);
// Use an old value to calculate the rectangle for progress.
percent = (float)(oldValue - min) / (float)(max - min);
oldValueRect.Width = (int)((float)oldValueRect.Width * percent);
Rectangle updateRect = new Rectangle();
// Find only the part of the screen that must be updated.
if (newValueRect.Width > oldValueRect.Width)
updateRect.X = oldValueRect.Size.Width;
updateRect.Width = newValueRect.Width - oldValueRect.Width;
else
updateRect.X = newValueRect.Size.Width;
updateRect.Width = oldValueRect.Width - newValueRect.Width;
updateRect.Height = this.Height;
// Invalidate the intersection region only.
this.Invalidate(updateRect);
public Color ProgressBarColor
get
return BarColor;
set
BarColor = value;
// Invalidate the control to get a repaint.
this.Invalidate();
private void Draw3DBorder(Graphics g)
int PenWidth = (int)Pens.White.Width;
g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));
g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top), new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth));
g.DrawLine(Pens.White, new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth),
new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
g.DrawLine(Pens.White, new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top),
new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
参考技术A 无需重写
自己新建个组建,继承自Control或PictureBox
自己绘制进度
向外提供最小值最大值当前值属性或方法即可
当值改变时,重绘
override OnPaint 参考技术B http://www.yesky.com/427/1878927.shtml
这个连接上的内容看一下就OK了
我看了UserControl和Control类的区别还是有区别的,Control类继承了实现了更多的接口,很复杂。UserControl就只单纯的提供简单的灵活的控件自定义!
Control类不能被继承(可以继承,可是里面要怎么写呢?不知道了),应为封装的你看不到他里面的方法实现!所以要继承UserControl本回答被提问者采纳
(68)C#里怎么样提供一个有窗口显示进度条的拷贝目录的功能
(68)C#里怎么样提供一个有窗口显示进度条的拷贝目录的功能
在C#里开发,常常会遇到拷贝大目录的文件,比如很多LOG日志,运行时间久了,需要把它们备份起来,那么就需要拷贝这些文件,这时候就会比较久,如果不显示一个提示窗口,就让人不知道这个程序在干什么样的事情,误认为程序已经出错,或者没有干事情。
在C#里提供这一个窗口,是非常简单的,只需要使用下几行代码就解决了,这个例子演示如下:
using System;
usin
以上是关于重写C# winform 进度条的样式(要代码示例)的主要内容,如果未能解决你的问题,请参考以下文章