Code:
public partial class FlatProgressBar : UserControl
{
public enum Mode
{
None,
Percentage,
Progress,
Number
}
private Mode _displayMode = Mode.Percentage;
private float _Max = 100;
private Color _progressBarColor = Color.Blue;
private float _value;
public FlatProgressBar()
{
Min = 0;
InitializeComponent();
}
[Category("ProgressBar")]
public float Value
{
get { return _value; }
set
{
_value = value;
Invalidate();
}
}
[Category("ProgressBar")]
public Color ProgressBarColor
{
get { return _progressBarColor; }
set
{
_progressBarColor = value;
Invalidate();
}
}
[Category("ProgressBar")]
public Mode DisplayMode
{
get { return _displayMode; }
set
{
_displayMode = value;
Invalidate();
}
}
[Category("ProgressBar")]
public float Min { get; set; }
[Category("ProgressBar")]
public float Max
{
get { return _Max; }
set { _Max = value; }
}
private void FlatProgressBar_Paint(object sender, PaintEventArgs e)
{
var gfx = e.Graphics;
var fontBrush = new SolidBrush(ForeColor);
if (_value == 0)
{
switch (_displayMode)
{
case Mode.None:
break;
case Mode.Number:
gfx.DrawString("0", Font, fontBrush, new PointF(2, ClientRectangle.Height/2 - Font.Size + 1.5f));
break;
case Mode.Percentage:
gfx.DrawString("0%", Font, fontBrush, new PointF(2, ClientRectangle.Height/2 - Font.Size + 1.5f));
break;
case Mode.Progress:
gfx.DrawString("0 / " + Max, Font, fontBrush,
new PointF(2, ClientRectangle.Height / 2.0f - Font.Size + 1.5f));
break;
}
return;
}
var brush = new SolidBrush(_progressBarColor);
var percentage = _value/_Max;
var rect = new Rectangle(0, 0, (int) (ClientSize.Width*percentage), ClientRectangle.Height);
gfx.FillRectangle(brush, rect);
switch (_displayMode)
{
case Mode.None:
break;
case Mode.Number:
gfx.DrawString(_value.ToString(), Font, fontBrush,
new PointF(2, ClientRectangle.Height / 2.0f - Font.Size + 1.5f));
break;
case Mode.Percentage:
gfx.DrawString((int) (percentage*100.0f) + "%", Font, fontBrush,
new PointF(2, ClientRectangle.Height / 2.0f - Font.Size + 1.5f));
break;
case Mode.Progress:
gfx.DrawString(_value + " / " + _Max, Font, fontBrush,
new PointF(2, ClientRectangle.Height / 2.0f - Font.Size + 1.5f));
break;
}
fontBrush.Dispose();
brush.Dispose();
}
}