根据网络资源修改编写的一个进度条控件,主要是记录开发过程。
用户可以根据自己需要修改相应代码,或直接使用控件。也可以将代码作为子能够以控件的学习资料
写作目的主要是防止以后忘记。
编译环境 VS2010 C# XP sp3
详细的DLL及源代码 还有测试程序请 下载地址
https://download.csdn.net/download/anlog/10935465
详细控件源代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;//绘图
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
namespace ClassLibrary1
{
public class AnlogProgress:Control
{
///
/// ////////////////////////////////////////////////////////////////
///
public AnlogProgress() //构造函数
{
//打开双缓冲 禁止重绘背景 控件尺寸改变时要重绘 用户自绘 都设置为真 防止控件闪烁
//this.SetStyle( ControlStyles.AllPaintingInWmPaint |
// ControlStyles.OptimizedDoubleBuffer |
// ControlStyles.ResizeRedraw |
// ControlStyles.UserPaint,
// true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
//参考 网址 https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.controlstyles?redirectedfrom=MSDN&view=netframework-4.7.2
//网址 https://www.cnblogs.com/bomo/archive/2012/12/11/2813369.html
this.MouseDown += AnlogProgress_MouseDown;
this.MouseMove += AnlogProgress_MouseMove;
this.MouseUp += AnlogProgress_MouseUp;
}
/////////////////////////////////////////////////////////////////////////////////
Point originPoint;
Point originsetRectPoint;
bool setRectDown = false;
void AnlogProgress_MouseUp(object sender, MouseEventArgs e)
{
setRectDown = false;
}
void AnlogProgress_MouseMove(object sender, MouseEventArgs e)
{
if (setRectDown)
{
int dd = e.Location.X - originPoint.X;
double percent = (double)(originsetRectPoint.X + dd - this.backRect.X) / (this.backRect.Width - this.backRect.Height);
if (percent < 0)
{
this.Value = minimum;
this.foreRect.Width = 0;
this.setRect.X = backRect.X;
}
else if (percent > 1)
{
this.Value = maximum;
this.foreRect.Width = this.backRect.Width;
this.setRect.X = backRect.X + backRect.Width - backRect.Height;
}
else
{
this.Value = percent * maximum;
this.foreRect.Width = (int)(percent * this.backRect.Width);
this.setRect.X = originsetRectPoint.X + dd;
}
Invalidate();
}
}
void AnlogProgress_MouseDown(object sender, MouseEventArgs e)
{
if (setRect.Contains(e.Location))
{
this.originPoint = e.Location;
originsetRectPoint = this.setRect.Location;
this.setRectDown = true;
}
}
//Rectangle forceRect; //进度条进度区域 他是随着进度而改变的
//Rectangle backRect; //进度条整体区域 它的尺寸是相对稳定的
//Rectangle setRect; //进度控制块区域 他是正方形的,它的高度与进度条高度相同
//Color backgroundColor = Color.White;//是进度条整体区域的颜色
//Color forceColor = Color.Gray; //进度条颜色 为灰色
//Color setColor = Color.Black;
//////////////////////////////////////////////////////////////////////////////
Rectangle foreRect;
Rectangle backRect;
Rectangle setRect;
Color backgroundColor = Color.White;
Color foregroundColor = Color.Gray;
Color setRectColor = Color.Black;
Color fontColor = Color.Black;
int maximum = 100;
int minimum = 0;
double myValue = 0;
bool showPercent;
float fontSize = 9;
FontFamily myFontFamily = new FontFamily("宋体");
//////////////////////////////////////////////////////////////////////////////
[Category("General"), Description("Show Percent Tag"), Browsable(true)]
public bool ShowPercentTag
{
get { return showPercent; }
set
{
showPercent = value;
Invalidate();
}
}
[Category("General"), Description("Control's Maximum"), Browsable(true)]
public int Maximum
{
get { return maximum; }
set
{
maximum = value;
Invalidate();
}
}
[Category("General"), Description("Control's Minimum"), Browsable(true)]
public int Minimum
{
get { return minimum; }
set
{
minimum = value;
Invalidate();
}
}
[Category("General"), Description("Control's FontSize"), Browsable(true)]
public float FontSize
{
get { return fontSize; }
set
{
this.fontSize = value;
Invalidate();
}
}
[Category("General"), Description("Control's FontFamily"), Browsable(true)]
public FontFamily MyFontFamily
{
get { return myFontFamily; }
set
{
this.myFontFamily = value;
Invalidate();
}
}
[Category("Color"), Browsable(true)]
public Color BackgroundColor
{
get { return backgroundColor; }
set
{
this.backgroundColor = value;
Invalidate();
}
}
[Category("Color"), Browsable(true)]
public Color ForegroundColor
{
get { return foregroundColor; }
set
{
this.foregroundColor = value;
Invalidate();
}
}
[Category("Color"), Browsable(true)]
public Color SetRectColor
{
get { return setRectColor; }
set
{
this.setRectColor = value;
Invalidate();
}
}
[Category("Color"), Browsable(true)]
public Color FontColor
{
get { return fontColor; }
set
{
this.fontColor = value;
Invalidate();
}
}
///////////////////////////////////////////////////////////////////
[Category("General"), Description("Control's Width"), Browsable(true)]
public new int Width
{
get { return base.Width; }
set
{
base.Width = value;
foreRect.X = backRect.X = base.Width / 20;
backRect.Width = base.Width * 9 / 10;
foreRect.Width = (int)(myValue / maximum * backRect.Width);
setRect.X = (int)(myValue / maximum * (backRect.Width - backRect.Height) + foreRect.X);
Invalidate();
}
}
[Category("General"), Description("Control's Height"), Browsable(true)]
public new int Height
{
get { return base.Height; }
set
{
base.Height = value;
foreRect.Height = backRect.Height = setRect.Height = setRect.Width = base.Height / 3;
foreRect.Y = backRect.Y = setRect.Y = base.Height / 3;
Invalidate();
}
}
////////////////////////////////////////////////////////////////////////////////
protected EventHandler OnValueChanged;
public event EventHandler ValueChanged
{
add
{
if (OnValueChanged != null)
{
foreach (Delegate d in OnValueChanged.GetInvocationList())
{
if (object.ReferenceEquals(d, value)) { return; }
}
}
OnValueChanged = (EventHandler)Delegate.Combine(OnValueChanged, value);
}
remove
{
OnValueChanged = (EventHandler)Delegate.Remove(OnValueChanged, value);
}
}
/////////////////////////////////////////////////////////////////////////////////
[Category("General"), Description("Control's Value"), Browsable(true)]
public double Value
{
get { return myValue; }
set
{
if (myValue < Minimum)
throw new ArgumentException("小于最小值");
if (myValue > Maximum)
throw new ArgumentException("超过最大值");
myValue = value;
foreRect.Width = (int)(myValue / maximum * backRect.Width);
setRect.X = (int)(myValue / maximum * (backRect.Width - backRect.Height) + backRect.X);
if ((myValue - maximum) > 0)
{
foreRect.Width = backRect.Width;
setRect.X = backRect.Width - backRect.Height + backRect.X;
}
//如果添加了响应函数,则执行该函数
if (OnValueChanged != null)
{
OnValueChanged(this, EventArgs.Empty);
}
Invalidate();
}
}
/////////////////////////////////////////////////////////////////////////////////
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Width = Width;
this.Height = Height;
Invalidate();
}
///////////////////////////////////////////////////////////////////////////////////
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
DrawRect(e.Graphics);
DrawText(e.Graphics);
}
private void DrawRect(Graphics e)
{
Pen pen = new Pen(this.foregroundColor);
e.FillRectangle(new SolidBrush(this.backgroundColor), backRect);
e.DrawRectangle(new Pen(Color.Black), backRect);
e.FillRectangle(new SolidBrush(this.foregroundColor), foreRect);
e.DrawRectangle(new Pen(Color.Black), foreRect);
e.FillRectangle(new SolidBrush(this.setRectColor), setRect);
e.DrawRectangle(new Pen(Color.Black), setRect);
}
private void DrawText(Graphics e)
{
Point point = new Point();
point.X = this.backRect.X + this.backRect.Width * 3 / 7;
point.Y = this.backRect.Y + this.backRect.Height / 3;
SolidBrush brush = new SolidBrush(fontColor);
Font font = new Font(myFontFamily, this.fontSize);
string percent = ((int)this.myValue).ToString() + "%";
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
e.DrawString(percent, font, brush, backRect, format);
}
}
}
测试代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsAnlogProgressTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
try
{
if (anlogProgress1.Value + 1 < anlogProgress1.Maximum)
{
anlogProgress1.Value += 1;
}
else
{
anlogProgress1.Value = 0;
}
label1.Text = anlogProgress1.Value.ToString();
anlogProgress2.Value = anlogProgress1.Value;
}
catch
{
}
}
}
}