百分比进度控件----------WinForm控件开发系列
该控件是继承于 Control 基类开发的。这个控件主要就是GDI绘图方面。
百分比显示类型
1 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 }
新增的类如下
新增属性如下