该控件是继承于 Control 基类开发的。这个控件主要就是GDI绘图方面。
百分比显示类型
protected override void OnPaint(PaintEventArgs e) 2 { 3 base.OnPaint(e); 4 5 Graphics g = e.Graphics; 6 Rectangle rect = new Rectangle((int)this.ClientRectangle.X + ((int)this.ClientRectangle.Width / 2 - this.ArcRadius) + 1, (int)this.ClientRectangle.Y + ((int)this.ClientRectangle.Height / 2 - this.ArcRadius) + 1, this.ArcRadius * 2 - 2, this.ArcRadius * 2 - 2); 7 8 #region 环形 9 if (this.Type == PercentageType.Annulus) 10 { 11 g.SmoothingMode = SmoothingMode.AntiAlias; 12 #region 背景 13 Pen arcback_pen = new Pen(this.ArcBackColor, this.ArcThickness); 14 g.DrawArc(arcback_pen, ControlCommom.TransformRectangleByPen(rect, this.ArcThickness), 270, 360); 15 arcback_pen.Dispose(); 16 #endregion 17 18 if (this.ArcAnnulusBackColor != Color.Empty) 19 { 20 SolidBrush arcannulusback_sb = new SolidBrush(this.ArcAnnulusBackColor); 21 g.FillPie(arcannulusback_sb, rect.X + this.ArcThickness / 2, rect.Y + this.ArcThickness / 2, rect.Width - this.ArcThickness, rect.Height - this.ArcThickness, 270, 360); 22 arcannulusback_sb.Dispose(); 23 } 24 25 #region 百分比值 26 Pen arc_pen = new Pen(this.ArcColor, this.ArcThickness); 27 if (this.ArcRound) 28 { 29 arc_pen.StartCap = LineCap.Round; 30 arc_pen.EndCap = LineCap.Round; 31 } 32 g.DrawArc(arc_pen, ControlCommom.TransformRectangleByPen(rect, this.ArcThickness), 270, 360 * this.Value); 33 arc_pen.Dispose(); 34 #endregion 35 36 #region 文本 37 this.DrawValueText(g, rect); 38 #endregion 39 40 } 41 #endregion 42 #region 扇形 43 else if (this.Type == PercentageType.Sector) 44 { 45 g.SmoothingMode = SmoothingMode.AntiAlias; 46 #region 背景 47 SolidBrush arcback_sb = new SolidBrush(this.ArcBackColor); 48 g.FillPie(arcback_sb, rect.X, rect.Y, rect.Width, rect.Height, 270, 360); 49 arcback_sb.Dispose(); 50 #endregion 51 52 if (this.ArcAnnulusBackColor != Color.Empty) 53 { 54 SolidBrush arcannulusback_sb = new SolidBrush(this.ArcAnnulusBackColor); 55 g.FillPie(arcannulusback_sb, rect.X + this.ArcThickness / 2, rect.Y + this.ArcThickness / 2, rect.Width - this.ArcThickness, rect.Height - this.ArcThickness, 270, 360); 56 arcannulusback_sb.Dispose(); 57 } 58 59 #region 百分比值 60 SolidBrush arc_sb = new SolidBrush(this.ArcColor); 61 g.FillPie(arc_sb, rect.X, rect.Y, rect.Width, rect.Height, 270, 360 * this.Value); 62 arc_sb.Dispose(); 63 #endregion 64 65 #region 文本 66 this.DrawValueText(g, rect); 67 #endregion 68 69 } 70 #endregion 71 #region 圆弧 72 else if (this.Type == PercentageType.Arc) 73 { 74 g.SmoothingMode = SmoothingMode.AntiAlias; 75 int start = this.ArcAngle == 360 ? 270 : 180 + (180 - this.ArcAngle) / 2; 76 77 #region 背景 78 Pen arcback_pen = new Pen(this.ArcBackColor, this.ArcThickness); 79 g.DrawArc(arcback_pen, ControlCommom.TransformRectangleByPen(rect, this.ArcThickness), start, this.ArcAngle); 80 arcback_pen.Dispose(); 81 #endregion 82 83 #region 百分比值 84 Pen arc_pen = new Pen(this.ArcColor, this.ArcThickness); 85 if (this.ArcRound) 86 { 87 arc_pen.EndCap = LineCap.Round; 88 } 89 g.DrawArc(arc_pen, ControlCommom.TransformRectangleByPen(rect, this.ArcThickness), start, this.ArcAngle * this.Value); 90 arc_pen.Dispose(); 91 #endregion 92 93 #region 文本 94 this.DrawValueText(g, rect); 95 #endregion 96 97 } 98 #endregion 99 #region 方形 100 else if (this.Type == PercentageType.Quadrangle) 101 { 102 RectangleF rectf = new RectangleF(); 103 rectf.Width = 10 + this.SquareWidth * 10; 104 rectf.Height = 10 + this.SquareWidth * 10; 105 rectf.X = this.ClientRectangle.X + (this.ClientRectangle.Width - rectf.Width) / 2; 106 rectf.Y = this.ClientRectangle.Bottom - rectf.Height; 107 108 #region 背景 109 SolidBrush arcback_sb = new SolidBrush(this.ArcBackColor); 110 g.FillRectangle(arcback_sb, rectf); 111 arcback_sb.Dispose(); 112 #endregion 113 114 #region 百分比值 115 SolidBrush arc_sb = new SolidBrush(this.ArcColor); 116 string str = this.Value.ToString("F4"); 117 int index = str.IndexOf('.'); 118 int row = int.Parse(str.Substring(index + 1, 1)); 119 RectangleF row_rectf = new RectangleF(); 120 row_rectf.Width = rectf.Width; 121 row_rectf.Height = row * 1 + row * this.SquareWidth; 122 row_rectf.X = rectf.X; 123 row_rectf.Y = rectf.Bottom - row_rectf.Height; 124 g.FillRectangle(arc_sb, row_rectf); 125 126 int col = int.Parse(str.Substring(index + 2, 1)); 127 if (col > 0) 128 { 129 RectangleF col_rectf = new RectangleF(); 130 col_rectf.Width = col * 1 + col * this.SquareWidth; 131 col_rectf.Height = this.SquareWidth + 1; 132 col_rectf.X = rectf.X; 133 col_rectf.Y = row_rectf.Y - col_rectf.Height; 134 g.FillRectangle(arc_sb, col_rectf); 135 } 136 137 arc_sb.Dispose(); 138 #endregion 139 140 #region 边框 141 Pen arcbackborder_pen = new Pen(this.SquareBorderColor, 1); 142 for (int i = 0; i < 11; i++)//行 143 { 144 g.DrawLine(arcbackborder_pen, rectf.X, rectf.Y + i * 1 + i * this.SquareWidth, rectf.Right, rectf.Y + i * 1 + i * this.SquareWidth); 145 } 146 for (int i = 0; i < 11; i++)//列 147 { 148 g.DrawLine(arcbackborder_pen, rectf.X + i * 1 + i * this.SquareWidth, rectf.Y, rectf.X + i * 1 + i * this.SquareWidth, rectf.Bottom); 149 } 150 arcbackborder_pen.Dispose(); 151 #endregion 152 153 #region 百分比值文本 154 string value_str = (this.Value * 100).ToString("F0") + "%"; 155 StringFormat value_sf = new StringFormat(); 156 value_sf.FormatFlags = StringFormatFlags.NoWrap; 157 value_sf.Alignment = StringAlignment.Center; 158 value_sf.Trimming = StringTrimming.None; 159 Size value_size = g.MeasureString(value_str, this.ValueFont, new Size(), value_sf).ToSize(); 160 SolidBrush value_sb = new SolidBrush(this.ValueColor); 161 g.DrawString(value_str, this.ValueFont, value_sb, new RectangleF(rectf.X + (rectf.Width - value_size.Width) / 2, rectf.Y - value_size.Height, value_size.Width, value_size.Height), value_sf); 162 value_sb.Dispose(); 163 value_sf.Dispose(); 164 #endregion 165 166 } 167 #endregion 168 #region 条形 169 else if (this.Type == PercentageType.Bar) 170 { 171 if (this.ArcRound) 172 { 173 g.SmoothingMode = SmoothingMode.AntiAlias; 174 } 175 RectangleF rectf = new RectangleF(); 176 rectf.Width = this.ClientRectangle.Width - (this.ArcRound ? this.ArcThickness : 0); 177 rectf.Height = this.ArcThickness; 178 rectf.X = this.ClientRectangle.X + (this.ArcRound ? this.ArcThickness / 2 : 0); 179 rectf.Y = this.ClientRectangle.Bottom - rectf.Height; 180 181 #region 背景 182 Pen arcback_pen = new Pen(this.ArcBackColor, this.ArcThickness); 183 if (this.ArcRound) 184 { 185 arcback_pen.StartCap = LineCap.Round; 186 arcback_pen.EndCap = LineCap.Round; 187 } 188 g.DrawLine(arcback_pen, rectf.X, rectf.Bottom - rectf.Height / 2, rectf.Right, rectf.Bottom - rectf.Height / 2); 189 arcback_pen.Dispose(); 190 #endregion 191 192 #region 百分比值 193 Pen arc_pen = new Pen(this.ArcColor, this.ArcThickness); 194 if (this.ArcRound) 195 { 196 arc_pen.StartCap = LineCap.Round; 197 arc_pen.EndCap = LineCap.Round; 198 } 199 g.DrawLine(arc_pen, rectf.X, rectf.Bottom - rectf.Height / 2, (int)(rectf.Right * this.Value), rectf.Bottom - rectf.Height / 2); 200 arc_pen.Dispose(); 201 #endregion 202 203 #region 百分比值文本 204 string value_str = (this.Value * 100).ToString("F0") + "%"; 205 StringFormat value_sf = new StringFormat(); 206 value_sf.FormatFlags = StringFormatFlags.NoWrap; 207 value_sf.Alignment = StringAlignment.Center; 208 value_sf.Trimming = StringTrimming.None; 209 Size value_size = g.MeasureString(value_str, this.ValueFont, new Size(), value_sf).ToSize(); 210 SolidBrush value_sb = new SolidBrush(this.ValueColor); 211 g.DrawString(value_str, this.ValueFont, value_sb, new RectangleF(rectf.X + (rectf.Width - value_size.Width) / 2, rectf.Y - value_size.Height, value_size.Width, value_size.Height), value_sf); 212 value_sb.Dispose(); 213 value_sf.Dispose(); 214 #endregion 215 216 } 217 #endregion 218 219 }
新增的类如下
新增属性如下
/// <summary>
/// 百分比进度控件
/// </summary>
[ToolboxItem(true)]
[Description("百分比进度控件")]
[DefaultProperty("Value")]
[DefaultEvent("ValueChanged")]
[Designer(typeof(DottedLineBorderExtDesigner))]
public class PercentageProgressExt : Control
{
#region 新增事件
public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e);
private event ValueChangedEventHandler valueChanged;
/// <summary>
/// 百分比值更改事件
/// </summary>
[Description("百分比值更改事件")]
public event ValueChangedEventHandler ValueChanged
{
add { this.valueChanged += value; }
remove { this.valueChanged -= value; }
}
#endregion
#region 停用事件
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler PaddingChanged
{
add { base.PaddingChanged += value; }
remove { base.PaddingChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler TabIndexChanged
{
add { base.TabIndexChanged += value; }
remove { base.TabIndexChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler TabStopChanged
{
add { base.TabStopChanged += value; }
remove { base.TabStopChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler TextChanged
{
add { base.TextChanged += value; }
remove { base.TextChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler FontChanged
{
add { base.FontChanged += value; }
remove { base.FontChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler ForeColorChanged
{
add { base.ForeColorChanged += value; }
remove { base.ForeColorChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler RightToLeftChanged
{
add { base.RightToLeftChanged += value; }
remove { base.RightToLeftChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler ImeModeChanged
{
add { base.ImeModeChanged += value; }
remove { base.ImeModeChanged -= value; }
}
#endregion
#region 新增属性
private PercentageType type = PercentageType.Annulus;
/// <summary>
/// 百分比显示类型
/// </summary>
[DefaultValue(PercentageType.Annulus)]
[Description("百分比显示类型")]
public PercentageType Type
{
get { return this.type; }
set
{
if (this.type == value)
return;
this.type = value;
this.Invalidate();
}
}
private int arcRadius = 50;
/// <summary>
/// 圆形半径
/// </summary>
[DefaultValue(50)]
[Description("圆形半径")]
public int ArcRadius
{
get { return this.arcRadius; }
set
{
if (this.arcRadius == value || value < 0)
return;
this.arcRadius = value;
this.Invalidate();
}
}
private int arcAngle = 360;
/// <summary>
/// 圆弧弧度大小
/// </summary>
[DefaultValue(360)]
[Description("圆弧弧度大小")]
public int ArcAngle
{
get { return this.arcAngle; }
set
{
if (this.arcAngle == value || value < 0 || value > 360)
return;
this.arcAngle = value;
this.Invalidate();
}
}
private int arcThickness = 10;
/// <summary>
/// 弧线大小
/// </summary>
[DefaultValue(10)]
[Description("弧线大小")]
public int ArcThickness
{
get { return this.arcThickness; }
set
{
if (this.arcThickness == value || value < 0 || value > this.ArcRadius)
return;
this.arcThickness = value;
this.Invalidate();
}
}
private bool arcRound = false;
/// <summary>
/// 弧线是否为圆角
/// </summary>
[DefaultValue(false)]
[Description("弧线是否为圆角")]
public bool ArcRound
{
get { return this.arcRound; }
set
{
if (this.arcRound == value)
return;
this.arcRound = value;
this.Invalidate();
}
}
private Color arcAnnulusBackColor = Color.Empty;
/// <summary>
/// 环形背景颜色(仅限于Annulus、Sector)
/// </summary>
[DefaultValue(typeof(Color), "Empty")]
[Description("环形背景颜色(仅限于Annulus、Sector)")]
[Editor(typeof(ColorEditorExt), typeof(UITypeEditor))]
public Color ArcAnnulusBackColor
{
get { return this.arcAnnulusBackColor; }
set
{
if (this.arcAnnulusBackColor == value)
return;
this.arcAnnulusBackColor = value;
this.Invalidate();
}
}
private Color arcBackColor = Color.FromArgb(112, 220, 220, 220);
/// <summary>
/// 弧线背景颜色
/// </summary>
[DefaultValue(typeof(Color), "112, 220, 220, 220")]
[Description("弧线背景颜色")]
[Editor(typeof(ColorEditorExt), typeof(UITypeEditor))]
public Color ArcBackColor
{
get { return this.arcBackColor; }
set
{
if (this.arcBackColor == value)
return;
this.arcBackColor = value;
this.Invalidate();
}
}
private Color arcColor = Color.FromArgb(227, 240, 128, 128);
/// <summary>
/// 弧线颜色
/// </summary>
[DefaultValue(typeof(Color), "227, 240, 128, 128")]
[Description("弧线颜色")]
[Editor(typeof(ColorEditorExt), typeof(UITypeEditor))]
public Color ArcColor
{
get { return this.arcColor; }
set
{
if (this.arcColor == value)
return;
this.arcColor = value;
this.Invalidate();
}
}
#region 方形
private int squareWidth = 10;
/// <summary>
/// 方形小格大小
/// </summary>
[DefaultValue(10)]
[Description("方形小格大小")]
public int SquareWidth
{
get { return this.squareWidth; }
set
{
if (this.squareWidth == value || value < 0)
return;
this.squareWidth = value;
this.Invalidate();
}
}
private Color squareBorderColor = Color.FromArgb(149, 255, 255, 255);
/// <summary>
/// 方形小格边框颜色
/// </summary>
[DefaultValue(typeof(Color), "149, 255, 255, 255")]
[Description("方形小格边框颜色")]
[Editor(typeof(ColorEditorExt), typeof(UITypeEditor))]
public Color SquareBorderColor
{
get { return this.squareBorderColor; }
set
{
if (this.squareBorderColor == value)
return;
this.squareBorderColor = value;
this.Invalidate();
}
}
#endregion
#region 值文本
private float value = 0f;
/// <summary>
/// 百分比值(0-1)
/// </summary>
[DefaultValue(0f)]
[Description("百分比值(0-1)")]
public float Value
{
get { return this.value; }
set
{
if (this.value == value || value < 0 || value > 1)
return;
this.value = value;
this.Invalidate();
this.OnValueChanged(new ValueChangedEventArgs() { Value = this.value });
}
}
private Font valueFont = new Font("宋体", 15);
/// <summary>
/// 百分比值字体
/// </summary>
[DefaultValue(typeof(Font), "宋体, 15pt")]
[Description("百分比值字体")]
public Font ValueFont
{
get { return this.valueFont; }
set
{
if (this.valueFont == value)
return;
this.valueFont = value;
this.Invalidate();
}
}
private Color valueColor = Color.FromArgb(227, 255, 255, 255);
/// <summary>
/// 百分比值颜色
/// </summary>
[DefaultValue(typeof(Color), "227, 255, 255, 255")]
[Description("百分比值颜色")]
[Editor(typeof(ColorEditorExt), typeof(UITypeEditor))]
public Color ValueColor
{
get { return this.valueColor; }
set
{
if (this.valueColor == value)
return;
this.valueColor = value;
this.Invalidate();
}
}
#endregion
#endregion
#region 重写属性
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
protected new bool DesignMode
{
get
{
if (this.GetService(typeof(IDesignerHost)) != null || System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
{
return true; //界面设计模式
}
else
{
return false;//运行时模式
}
}
}
protected override Size DefaultSize
{
get
{
return new Size(100, 100);
}
}
protected override ImeMode DefaultImeMode
{
get
{
return System.Windows.Forms.ImeMode.Disable;
}
}
#endregion
#region 停用属性
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new Padding Padding
{
get
{
return base.Padding;
}
set
{
base.Padding = value;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new int TabIndex
{
get { return 0; }
set { base.TabIndex = 0; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new bool TabStop
{
get { return false; }
set { base.TabStop = false; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override RightToLeft RightToLeft
{
get
{
return base.RightToLeft;
}
set
{
base.RightToLeft = value;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new ImeMode ImeMode
{
get
{
return base.ImeMode;
}
set
{
base.ImeMode = value;
}
}
#endregion
public PercentageProgressExt()
{
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
}
#region 重写
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
int scale_arcRadius =(int)( this.ArcRadius * DotsPerInchHelper.DPIScale.XScale);
int scale_arcThickness = (int)(this.ArcThickness * DotsPerInchHelper.DPIScale.XScale);
int scale_squareWidth = (int)(this.SquareWidth * DotsPerInchHelper.DPIScale.XScale);
Rectangle rect = new Rectangle((int)this.ClientRectangle.X + ((int)this.ClientRectangle.Width / 2 - scale_arcRadius) + 1, (int)this.ClientRectangle.Y + ((int)this.ClientRectangle.Height / 2 - scale_arcRadius) + 1, scale_arcRadius * 2 - 2, scale_arcRadius * 2 - 2);
#region 环形
if (this.Type == PercentageType.Annulus)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
#region 背景
Pen arcback_pen = new Pen(this.ArcBackColor, scale_arcThickness);
g.DrawArc(arcback_pen, ControlCommom.TransformRectangleByPen(rect, scale_arcThickness), 270, 360);
arcback_pen.Dispose();
#endregion
if (this.ArcAnnulusBackColor != Color.Empty)
{
SolidBrush arcannulusback_sb = new SolidBrush(this.ArcAnnulusBackColor);
g.FillPie(arcannulusback_sb, rect.X + scale_arcThickness / 2, rect.Y + scale_arcThickness / 2, rect.Width - scale_arcThickness, rect.Height - scale_arcThickness, 270, 360);
arcannulusback_sb.Dispose();
}
#region 百分比值
Pen arc_pen = new Pen(this.ArcColor, scale_arcThickness);
if (this.ArcRound)
{
arc_pen.StartCap = LineCap.Round;
arc_pen.EndCap = LineCap.Round;
}
g.DrawArc(arc_pen, ControlCommom.TransformRectangleByPen(rect, scale_arcThickness), 270, 360 * this.Value);
arc_pen.Dispose();
#endregion
#region 文本
this.DrawValueText(g, rect);
#endregion
}
#endregion
#region 扇形
else if (this.Type == PercentageType.Sector)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
#region 背景
SolidBrush arcback_sb = new SolidBrush(this.ArcBackColor);
g.FillPie(arcback_sb, rect.X, rect.Y, rect.Width, rect.Height, 270, 360);
arcback_sb.Dispose();
#endregion
if (this.ArcAnnulusBackColor != Color.Empty)
{
SolidBrush arcannulusback_sb = new SolidBrush(this.ArcAnnulusBackColor);
g.FillPie(arcannulusback_sb, rect.X + scale_arcThickness / 2, rect.Y + scale_arcThickness / 2, rect.Width - scale_arcThickness, rect.Height - scale_arcThickness, 270, 360);
arcannulusback_sb.Dispose();
}
#region 百分比值
SolidBrush arc_sb = new SolidBrush(this.ArcColor);
g.FillPie(arc_sb, rect.X, rect.Y, rect.Width, rect.Height, 270, 360 * this.Value);
arc_sb.Dispose();
#endregion
#region 文本
this.DrawValueText(g, rect);
#endregion
}
#endregion
#region 圆弧
else if (this.Type == PercentageType.Arc)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
int start = this.ArcAngle == 360 ? 270 : 180 + (180 - this.ArcAngle) / 2;
#region 背景
Pen arcback_pen = new Pen(this.ArcBackColor, scale_arcThickness);
g.DrawArc(arcback_pen, ControlCommom.TransformRectangleByPen(rect, scale_arcThickness), start, this.ArcAngle);
arcback_pen.Dispose();
#endregion
#region 百分比值
Pen arc_pen = new Pen(this.ArcColor, scale_arcThickness);
if (this.ArcRound)
{
arc_pen.EndCap = LineCap.Round;
}
g.DrawArc(arc_pen, ControlCommom.TransformRectangleByPen(rect, scale_arcThickness), start, this.ArcAngle * this.Value);
arc_pen.Dispose();
#endregion
#region 文本
this.DrawValueText(g, rect);
#endregion
}
#endregion
#region 方形
else if (this.Type == PercentageType.Quadrangle)
{
RectangleF rectf = new RectangleF();
rectf.Width = 10 + scale_squareWidth * 10;
rectf.Height = 10 + scale_squareWidth * 10;
rectf.X = this.ClientRectangle.X + (this.ClientRectangle.Width - rectf.Width) / 2;
rectf.Y = this.ClientRectangle.Bottom - rectf.Height;
#region 背景
SolidBrush arcback_sb = new SolidBrush(this.ArcBackColor);
g.FillRectangle(arcback_sb, rectf);
arcback_sb.Dispose();
#endregion
#region 百分比值
SolidBrush arc_sb = new SolidBrush(this.ArcColor);
string str = this.Value.ToString("F4");
int index = str.IndexOf('.');
int row = int.Parse(str.Substring(index + 1, 1));
RectangleF row_rectf = new RectangleF();
row_rectf.Width = rectf.Width;
row_rectf.Height = row * 1 + row * scale_squareWidth;
row_rectf.X = rectf.X;
row_rectf.Y = rectf.Bottom - row_rectf.Height;
g.FillRectangle(arc_sb, row_rectf);
int col = int.Parse(str.Substring(index + 2, 1));
if (col > 0)
{
RectangleF col_rectf = new RectangleF();
col_rectf.Width = col * 1 + col * scale_squareWidth;
col_rectf.Height = scale_squareWidth + 1;
col_rectf.X = rectf.X;
col_rectf.Y = row_rectf.Y - col_rectf.Height;
g.FillRectangle(arc_sb, col_rectf);
}
arc_sb.Dispose();
#endregion
#region 边框
Pen arcbackborder_pen = new Pen(this.SquareBorderColor, 1);
for (int i = 0; i < 11; i++)//行
{
g.DrawLine(arcbackborder_pen, rectf.X, rectf.Y + i * 1 + i * scale_squareWidth, rectf.Right, rectf.Y + i * 1 + i * scale_squareWidth);
}
for (int i = 0; i < 11; i++)//列
{
g.DrawLine(arcbackborder_pen, rectf.X + i * 1 + i * scale_squareWidth, rectf.Y, rectf.X + i * 1 + i * scale_squareWidth, rectf.Bottom);
}
arcbackborder_pen.Dispose();
#endregion
#region 百分比值文本
string value_str = (this.Value * 100).ToString("F0") + "%";
StringFormat value_sf = new StringFormat();
value_sf.FormatFlags = StringFormatFlags.NoWrap;
value_sf.Alignment = StringAlignment.Center;
value_sf.Trimming = StringTrimming.None;
Size value_size = g.MeasureString(value_str, this.ValueFont, new Size(), value_sf).ToSize();
SolidBrush value_sb = new SolidBrush(this.ValueColor);
g.DrawString(value_str, this.ValueFont, value_sb, new RectangleF(rectf.X + (rectf.Width - value_size.Width) / 2, rectf.Y - value_size.Height, value_size.Width, value_size.Height), value_sf);
value_sb.Dispose();
value_sf.Dispose();
#endregion
}
#endregion
#region 条形
else if (this.Type == PercentageType.Bar)
{
if (this.ArcRound)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
}
RectangleF rectf = new RectangleF();
rectf.Width = this.ClientRectangle.Width - (this.ArcRound ? scale_arcThickness : 0);
rectf.Height = scale_arcThickness;
rectf.X = this.ClientRectangle.X + (this.ArcRound ? scale_arcThickness / 2 : 0);
rectf.Y = this.ClientRectangle.Bottom - rectf.Height;
#region 背景
Pen arcback_pen = new Pen(this.ArcBackColor, scale_arcThickness);
if (this.ArcRound)
{
arcback_pen.StartCap = LineCap.Round;
arcback_pen.EndCap = LineCap.Round;
}
g.DrawLine(arcback_pen, rectf.X, rectf.Bottom - rectf.Height / 2, rectf.Right, rectf.Bottom - rectf.Height / 2);
arcback_pen.Dispose();
#endregion
#region 百分比值
Pen arc_pen = new Pen(this.ArcColor, scale_arcThickness);
if (this.ArcRound)
{
arc_pen.StartCap = LineCap.Round;
arc_pen.EndCap = LineCap.Round;
}
g.DrawLine(arc_pen, rectf.X, rectf.Bottom - rectf.Height / 2, (int)(rectf.Right * this.Value), rectf.Bottom - rectf.Height / 2);
arc_pen.Dispose();
#endregion
#region 百分比值文本
string value_str = (this.Value * 100).ToString("F0") + "%";
StringFormat value_sf = new StringFormat();
value_sf.FormatFlags = StringFormatFlags.NoWrap;
value_sf.Alignment = StringAlignment.Center;
value_sf.Trimming = StringTrimming.None;
Size value_size = g.MeasureString(value_str, this.ValueFont, new Size(), value_sf).ToSize();
SolidBrush value_sb = new SolidBrush(this.ValueColor);
g.DrawString(value_str, this.ValueFont, value_sb, new RectangleF(rectf.X + (rectf.Width - value_size.Width) / 2, rectf.Y - value_size.Height, value_size.Width, value_size.Height), value_sf);
value_sb.Dispose();
value_sf.Dispose();
#endregion
}
#endregion
}
#endregion
#region 虚方法
protected virtual void OnValueChanged(ValueChangedEventArgs e)
{
if (this.valueChanged != null)
{
this.valueChanged(this, e);
}
}
#endregion
#region 私有方法
/// <summary>
/// 绘制百分值文本
/// </summary>
/// <param name="g"></param>
/// <param name="rect"></param>
private void DrawValueText(Graphics g, RectangleF rectf)
{
string value_str = (this.Value * 100).ToString("F0") + "%";
StringFormat value_sf = new StringFormat();
value_sf.FormatFlags = StringFormatFlags.NoWrap;
value_sf.Alignment = StringAlignment.Center;
value_sf.Trimming = StringTrimming.None;
Size value_size = g.MeasureString(value_str, this.ValueFont, new Size(), value_sf).ToSize();
SolidBrush value_sb = new SolidBrush(this.ValueColor);
g.DrawString(value_str, this.ValueFont, value_sb, new RectangleF(rectf.X + (rectf.Width - value_size.Width) / 2f, rectf.Y + (rectf.Height - value_size.Height) / 2f, value_size.Width, value_size.Height), value_sf);
value_sb.Dispose();
value_sf.Dispose();
}
#endregion
#region 类
/// <summary>
/// 百分比值更改事件参数
/// </summary>
[Description("百分比值更改事件参数")]
public class ValueChangedEventArgs : EventArgs
{
/// <summary>
/// 百分比值
/// </summary>
[Description("百分比值")]
public float Value { get; set; }
}
#endregion
#region 枚举
/// <summary>
/// 百分比显示类型
/// </summary>
[Description("百分比显示类型")]
public enum PercentageType
{
/// <summary>
/// 环形
/// </summary>
Annulus,
/// <summary>
/// 圆弧
/// </summary>
Arc,
/// <summary>
/// 扇形
/// </summary>
Sector,
/// <summary>
/// 方形
/// </summary>
Quadrangle,
/// <summary>
/// 条形
/// </summary>
Bar
}
#endregion
}