using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D ;
using System.Data;
using System.Windows.Forms;
namespace MyControls
{
/// <summary>
/// GProgressBar 的摘要说明。
/// </summary>
public class GProgressBar : System.Windows.Forms.UserControl
{
#region 必需的设计器变量
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
#endregion
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// GProgressBar
//
this.Name = "GProgressBar";
this.Size = new System.Drawing.Size(150, 24);
}
#endregion
#region 私有变量
private int mMax = 100;
private int mMin = 0;
private int mValue = 0 ;
private int mStep = 1;
private bool mRate = false;
private BorderStyle mBorderStyle = BorderStyle.Fixed3D ;
#endregion
#region 构造/析构
public GProgressBar()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
base.Height = 23 ;
///使用双缓冲,支持透明绘制
///DoubleBuffer:如果为 true,则绘制在缓冲区中进行,完成后将结果输出到屏幕上。
///双重缓冲区可防止由控件重绘引起的闪烁。
///要完全启用双重缓冲,还必须将 UserPaint 和 AllPaintingInWmPaint 样式位设置为 true。
SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.SupportsTransparentBackColor,
true);
UpdateStyles();
}
~GProgressBar(){}
#region 重写基类的Dispose实现
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#endregion
#endregion
#region 属性
#region 最大值
/// <summary>
/// 最大值
/// </summary>
[Browsable(true), Description("最大值"), Category("新属性")]
public int Max
{
get
{
return mMax ;
}
set
{
mMax = value > 0?value:1;
}
}
#endregion
#region 最小值
/// <summary>
/// 最小值
/// </summary>
[Browsable(true), Description("最小值"), Category("新属性")]
public int Min
{
get
{
return mMin ;
}
set
{
mMin = value ;
}
}
#endregion
#region 当前值
/// <summary>
/// 当前值
/// </summary>
[Browsable(true), Description("当前值"), Category("新属性")]
public int Value
{
get
{
return mValue ;
}
set
{
if (value <= this.Max)
mValue = value ;
else
mValue = this.Max ;
this.Refresh() ;
}
}
#endregion
#region 大小
/// <summary>
/// 大小
/// </summary>
[Browsable(true), Description("大小"), Category("新属性")]
public new Size Size
{
get
{
return base.Size ;
}
set
{
base.Size = value ;
}
}
#endregion
#region 步长
/// <summary>
/// 步长
/// </summary>
[Browsable(true), Description("步长"), Category("新属性")]
public int Step
{
get
{
return mStep ;
}
set
{
mStep = value ;
}
}
#endregion
#region 背景色
/// <summary>
/// 背景色
/// </summary>
[Browsable(true), Description("背景色"), Category("新属性")]
public override Color BackColor
{
get
{
return base.BackColor ;
}
set
{
base.BackColor = value ;
}
}
#endregion
#region 前景色
/// <summary>
/// 前景色
/// </summary>
[Browsable(true), Description("前景色"), Category("新属性")]
public override Color ForeColor
{
get
{
return base.ForeColor ;
}
set
{
base.ForeColor = value ;
}
}
#endregion
#region 是否显示比例数字
/// <summary>
/// 是否显示比例数字
/// </summary>
[Browsable(true), Description("是否显示比例数字"), Category("新属性")]
public bool Rate
{
get
{
return mRate ;
}
set
{
mRate = value ;
}
}
#endregion
#region 外观
/// <summary>
/// 外观
/// </summary>
[DefaultValue(0), Description("外观"), Category("新属性")]
public BorderStyle BorderStyle
{
get
{
return this.mBorderStyle;
}
set
{
if (this.mBorderStyle != value)
{
this.mBorderStyle = value;
this.Refresh() ;
}
}
}
#endregion
#endregion
#region 公有方法
#region 执行增步操作
/// <summary>
/// 执行增步操作
/// </summary>
public void PerformStep()
{
Value++ ;
}
#endregion
#endregion
#region 私有方法
#region 绘制时钟
/// <summary>
/// 绘制进度条(重载1)
/// </summary>
/// <returns>位图对象</returns>
public Bitmap DrawProgress()
{
return this.DrawProgress(this.ClientRectangle);
}
/// <summary>
/// 绘制进度条(重载2)
/// </summary>
/// <param name="destRect">区域</param>
/// <returns>位图对象</returns>
public Bitmap DrawProgress(Rectangle destRect)
{
Bitmap bitmap = new Bitmap(destRect.Width, destRect.Height);
Graphics g = Graphics.FromImage(bitmap);
//设置绘图面板的绘制质量等
g.CompositingQuality = CompositingQuality.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
g.SmoothingMode = SmoothingMode.HighQuality;
GraphicsState gs = g.Save();
g.TranslateTransform(destRect.X, destRect.Y);
int iWidth = (Value * destRect.Width) / Max ;
Rectangle DrawRect = new Rectangle(destRect.X,destRect.Y,iWidth,destRect.Height) ;
SolidBrush front = new SolidBrush(this.ForeColor) ;
g.FillRectangle(front,DrawRect);
if (Rate)
{
int iRate = Value * 100 / Max ;
string strText = iRate.ToString() + "%" ;
int iTextWidth = (int)g.MeasureString(strText,this.Font).Width ;
int iTextHeight = (int)g.MeasureString(strText,this.Font).Height;
int x = destRect.Left + (destRect.Width - iTextWidth) / 2 ;
int y = destRect.Top + (destRect.Height - iTextHeight) / 2;
Point posS = new Point(x,destRect.Top);
Point posE = new Point(x + iTextWidth,destRect.Bottom);
LinearGradientBrush textbrush = new LinearGradientBrush(posS,posE,this.BackColor,this.ForeColor) ;
g.DrawString(strText,this.Font,textbrush,x,y);
}
g.Restore(gs);
return bitmap;
}
/// <summary>
/// 绘制进度条(重载3)
/// </summary>
/// <param name="g">Graphics对象</param>
/// <param name="rect">区域</param>
private void DrawProgress(Graphics g,Rectangle destRect)
{
int iWidth = (Value * destRect.Width) / Max ;
Rectangle DrawRect = new Rectangle(destRect.X,destRect.Y,iWidth,destRect.Height) ;
SolidBrush front = new SolidBrush(this.ForeColor) ;
g.FillRectangle(front,DrawRect);
if (Rate)
{
int iRate = Value * 100 / Max ;
string strText = iRate.ToString() + "%" ;
int iTextWidth = (int)g.MeasureString(strText,this.Font).Width ;
int iTextHeight = (int)g.MeasureString(strText,this.Font).Height;
int x = destRect.Left + (destRect.Width - iTextWidth) / 2 ;
int y = destRect.Top + (destRect.Height - iTextHeight) / 2;
Point posS = new Point(x,destRect.Top);
Point posE = new Point(x + iTextWidth,destRect.Bottom);
LinearGradientBrush textbrush = new LinearGradientBrush(posS,posE,this.BackColor,this.ForeColor) ;
g.DrawString(strText,this.Font,textbrush,x,y);
}
}
#endregion
#endregion
#region 重写的方法
#region OnPaintBackground
/// <summary>
/// OnPaintBackground
/// </summary>
/// <param name="e">事件包</param>
protected override void OnPaintBackground(PaintEventArgs e)
{
SolidBrush back = new SolidBrush(this.BackColor);
e.Graphics.FillRectangle(back,e.ClipRectangle);
base.OnPaintBackground(e);
}
#endregion
#region OnPaint
/// <summary>
/// OnPaint
/// </summary>
/// <param name="e">事件包</param>
protected override void OnPaint(PaintEventArgs e)
{
/*
Graphics g = e.Graphics;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImageUnscaled(DrawProgress(), 0, 0);
base.OnPaint(e);
*/
//if (!this.DesignMode) //设计模式
Graphics g = e.Graphics;
g.CompositingQuality = CompositingQuality.HighQuality;
DrawProgress(g,this.ClientRectangle);
//DrawProgress(e.Graphics,e.ClipRectangle);
switch(BorderStyle)
{
case BorderStyle.None:
break;
case BorderStyle.FixedSingle:
System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,this.ClientRectangle,Border3DStyle.Flat);
//System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,e.ClipRectangle,Border3DStyle.Flat);
break;
case BorderStyle.Fixed3D:
System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,this.ClientRectangle,Border3DStyle.Sunken);
//System.Windows.Forms.ControlPaint.DrawBorder3D(e.Graphics,e.ClipRectangle,Border3DStyle.Sunken);
break;
}
base.OnPaint(e);
}
#endregion
#region OnLayout
/// <summary>
/// OnLayout
/// </summary>
/// <param name="e">事件包</param>
protected override void OnLayout(LayoutEventArgs e)
{
base.Refresh();
base.OnLayout(e);
}
#endregion
#endregion
}
}