My solution like this.
class LevelBar : Label
{
Label[] labels;
int bars, value;
public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e);
public event ValueChangedEventHandler ValueChanged;
public LevelBar()
{
bars = 5;
this.Value = 2;
labels = new Label[bars];
this.Cursor = Cursors.Hand;
BackColor = Color.Transparent;
}
public override string Text
{
get
{
return string.Empty;
}
set
{
base.Text = string.Empty;
}
}
public override bool AutoSize
{
get
{
return false;
}
set
{
base.AutoSize = false;
}
}
public int Value
{
get { return value; }
private set
{
this.value = value;
ValueChangedEventArgs e = new ValueChangedEventArgs(this.Value);
if (ValueChanged != null)
ValueChanged(this, e);
}
}
[Browsable(true)]
public int Bars
{
get { return bars; }
set { bars = value; createBars(); }
}
protected override void OnCreateControl()
{
base.OnCreateControl();
createBars();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
createBars();
}
int barWidth, barHeight;
void createBars()
{
disposeAllandCreateNew();
barWidth = 2 * this.Width / (3 * bars - 1);
barHeight = 2 * this.Height / (bars + 1);
for (int i = 0; i < labels.Length; i++)
{
labels[i].BorderStyle = BorderStyle.FixedSingle;
labels[i].Click += LevelBar_Click;
this.Controls.Add(labels[i]);
labels[i].Cursor = Cursors.Hand;
labels[i].AutoSize = false;
labels[i].Width = barWidth;
labels[i].Height = barHeight + (barHeight / 2) * i;
labels[i].Left = (int)(i * (1.5 * barWidth));
labels[i].Top = this.Height - labels[i].Height;
labels[i].BackColor = Color.Green;
}
setBarColors();
}
void disposeAllandCreateNew()
{
for (int i = 0; i < labels.Length; i++)
{
if (labels[i] != null) labels[i].Dispose();
}
labels = new Label[bars];
for (int i = 0; i < labels.Length; i++)
{
labels[i] = new Label();
}
}
void LevelBar_Click(object sender, EventArgs e)
{
int val = (sender as Label).Left / (3 * barWidth / 2);
this.Value = val + 1;
setBarColors();
}
void setBarColors()
{
for (int k = 0; k < bars; k++)
{
if (k < this.Value)
labels[k].BackColor = Color.Green;
else
labels[k].BackColor = this.BackColor;
}
}
}
class ValueChangedEventArgs
{
int value;
public ValueChangedEventArgs(int value)
{
this.value = value;
}
public int Value
{
get { return value; }
set { this.value = value; }
}
}