using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Text;
using System.Collections.Specialized;
namespace CNEE.IF.VCY
{
/// <summary>
/// ProcessBarValue 的摘要说明。
/// </summary>
public class ProcessBarValue : System.Windows.Forms.UserControl
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public ProcessBarValue()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitializeComponent 调用后添加任何初始化
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// ProcessBarValue
//
this.Name = "ProcessBarValue";
}
#endregion
//
int min = 0; //Minimum value for progress range
int max = 100; //Maximum value for progress range
int val = 0; //Current progress
Color BarColor = Color.Blue; //Color of progress meter
string content = "Contents here";
int blockWidth = 36;
int intervalWidth = 4;
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();
}
}
public string ContentText
{
get { return content; }
set
{
content = value;
this.Refresh();
}
}
public int BlockWidth
{
get { return blockWidth; }
set
{
if (value >= 0)
{
blockWidth = value;
}
else
{
blockWidth = 0;
}
if (value <= max - min)
{
blockWidth = value;
}
else
{
blockWidth = max - min;
}
this.Refresh();
}
}
public int IntervalWidth
{
get { return intervalWidth; }
set
{
if (value >= 0)
{
intervalWidth = value;
}
else
{
intervalWidth = 0;
}
if (value <= max - min)
{
intervalWidth = value;
}
else
{
intervalWidth = max - min;
}
this.Refresh();
}
}
// public AdvancedProgressBar()
// {
// InitializeComponent();
// }
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;
Rectangle rectFilled = new Rectangle();
Rectangle rectNotFilled = new Rectangle();
rectFilled.Height = rect.Height;
rectNotFilled.Height = rect.Height;
rectFilled.Y = rect.Y;
rectNotFilled.Y = rect.Y;
rectFilled.Width = blockWidth;
rectNotFilled.Width = intervalWidth;
int x = rect.X;
//Calculate area for drawing the progress.
rect.Width = (int)((float)rect.Width * percent);
//Draw the progress meter.
//g.FillRectangle(brush, rect);
while (true)
{
rectFilled.X = x;
if (x + rectFilled.Width < rect.Width)
{
g.FillRectangle(brush, rectFilled);
}
else
{
rectFilled.Width = rect.Width - x;
g.FillRectangle(brush, rectFilled);
break;
}
x += rectFilled.Width;
rectNotFilled.X = x;
if (x + rectNotFilled.Width < rect.Width)
{
g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
}
else
{
rectNotFilled.Width = rect.Width - x;
g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
break;
}
x += rectNotFilled.Width;
}
//Draw a three-dimensional border around the control.
Draw3DBorder(g);
//Draw [ xx mins left ]
DrawText(content);
//Clean up.
brush.Dispose();
g.Dispose();
}
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));
}
/// <summary>
/// 标签
/// </summary>
private Label ContentLabel;
private void DrawText(string content)
{
ContentLabel = new System.Windows.Forms.Label();
int leftWidth = (int)((float)this.ClientRectangle.Width * (((float)max - (float)val) / ((float)max - (float)min)));
ContentLabel.Text = content;
int middleY = this.ClientRectangle.Height / 2 - ContentLabel.Height / 2;
if (ContentLabel.Width < leftWidth)
{
ContentLabel.ForeColor = Color.Black;
int middleX = this.ClientRectangle.Width / 2 - ContentLabel.Width / 2 + (this.ClientRectangle.Width - leftWidth) / 2;
ContentLabel.Location = new Point(middleX, middleY);
}
else
{
ContentLabel.ForeColor = Color.White;
int middleX = (this.ClientRectangle.Width - leftWidth) / 2 - ContentLabel.Width / 2;
ContentLabel.Location = new Point(middleX, middleY);
}
}
}
}