最终的效果如上图.它主要是由几个图片绘制而成,左右两个圆角、经过的、未经过的还有一个%分数。原理非常简单,我们看看代码吧。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
using System;
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
using System.Collections.Generic;
4
using System.ComponentModel;
5
using System.Data;
6
using System.Drawing;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.Drawing.Imaging;
10
using System.Reflection;
11![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
namespace Mediar.Controls
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
14
public partial class ProgressBar : Control
15![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
16
17![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
private byte maximum = 100;
19
public byte Maximum
20![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
21![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ maximum = value; }
22![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return maximum; }
23![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
}
25![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
private byte minimum = 0;
27
public byte Minimum
28![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
29![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ minimum = value; }
30![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return minimum; }
31![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
}
33
34
35![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public int Value
{ get; set; }
37![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
private Color passColor = Color.Blue;
40
public Color PassColor
41![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
42![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ passColor = value; }
43![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return passColor; }
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
}
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
private Color unPassColor = Color.Gray;
48
public Color UnPassColor
49![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
50![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ unPassColor = value; }
51![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return unPassColor; }
52![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
}
54![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
public ProgressBar()
56![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
57
this.Height = 33;
58
InitializeComponent();
59
60
}
61![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62
protected override void OnPaint(PaintEventArgs pe)
63![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
64![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
DrawEllipse();
66![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
67![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
68
base.OnPaint(pe);
69
}
70
private void DrawEllipse()
71![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
//System.Drawing.Pen myPen;
73
//myPen = new System.Drawing.Pen(System.Drawing.Color.Red);
74![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
Brush bUnPass = new SolidBrush(unPassColor);
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
Brush bPass = new SolidBrush(passColor);
78![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
Assembly assembly = this.GetType().Assembly;
80
System.IO.Stream passStart = assembly.GetManifestResourceStream(@"Mediar.Controls.Images.passStart.png");
81
System.IO.Stream pass = assembly.GetManifestResourceStream(@"Mediar.Controls.Images.pass.png");
82
System.IO.Stream unpass = assembly.GetManifestResourceStream(@"Mediar.Controls.Images.unpass.png");
83
System.IO.Stream textBackgroud = assembly.GetManifestResourceStream(@"Mediar.Controls.Images.textBackgroud.png");
84
System.IO.Stream end = assembly.GetManifestResourceStream(@"Mediar.Controls.Images.end.png");
85![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
Image passStartpng = new Bitmap(passStart);
88![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
System.Drawing.Graphics formGraphics = this.CreateGraphics();
90![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
int iPass = (int)((Value * 1.0 / (Maximum - Minimum)) * this.Width);
92
int y = 10;
93![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
94
formGraphics.DrawImage(passStartpng, 0, y);
95![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
formGraphics.DrawImage(new Bitmap(pass), new Rectangle(8, y, iPass, 12), new Rectangle(0, 0, 1, 12), GraphicsUnit.Pixel);
98![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99
formGraphics.DrawImage(new Bitmap(unpass), new Rectangle(8 + iPass, y, this.Width - iPass - 14, 12), new Rectangle(0, 0, 1, 12), GraphicsUnit.Pixel);
100![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
102
formGraphics.DrawImage(new Bitmap(end), this.Width - 8, y);
103![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
104
if (this.Width - iPass < 25)
105
iPass = this.Width - 25;
106
else if (iPass < 25)
107
iPass = 25;
108![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
110![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
112
formGraphics.DrawImage(new Bitmap(textBackgroud), iPass - 25, 0);
113![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
114
SizeF sf = formGraphics.MeasureString(string.Format("{0}%", Value), this.Font);
115
formGraphics.DrawString(string.Format("{0}%", Value), this.Font, new SolidBrush(this.ForeColor), iPass - sf.Width / 2, (33 - sf.Height) / 2);
116![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
118![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
119![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
120
bPass.Dispose();
121
formGraphics.Dispose();
122
}
123![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
124
125![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
126![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
127
internal Color GetTransparentColor(Bitmap image)
128![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
129
return image.GetPixel(0, 0);
130
}
131
}
132
}
133![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)