ScpMonitor/AxisBar.cs (122 lines of code) (raw):

using System; using System.Drawing; using System.Windows.Forms; namespace ScpMonitor { public partial class AxisBar : UserControl { private Color m_Colour = Color.Green; private int m_Maximum = 100; private int m_Minimum; private int m_Value; public AxisBar() { InitializeComponent(); } public int Minimum { get { return m_Minimum; } set { if (value < 0 || value > m_Maximum) { throw new ArgumentOutOfRangeException("Minimum"); } if (m_Value < value) { m_Value = value; } if (m_Minimum != value) { m_Minimum = value; Invalidate(); } } } public int Maximum { get { return m_Maximum; } set { if (value < 0 || value < m_Minimum) { throw new ArgumentOutOfRangeException("Maximum"); } if (m_Value > value) { m_Value = value; } if (m_Maximum != value) { m_Maximum = value; Invalidate(); } } } public int Value { get { return m_Value; } set { if (value < m_Minimum || value > m_Maximum) { throw new ArgumentOutOfRangeException("Maximum"); } if (m_Value != value) { var newRect = ClientRectangle; var oldRect = ClientRectangle; var oldValue = m_Value; float Fill; m_Value = value; Fill = (m_Value - m_Minimum)/(float) (m_Maximum - m_Minimum); newRect.Width = (int) (newRect.Width*Fill); Fill = (oldValue - m_Minimum)/(float) (m_Maximum - m_Minimum); oldRect.Width = (int) (oldRect.Width*Fill); var Rect = new Rectangle(); Rect.Height = Height; if (newRect.Width > oldRect.Width) { Rect.X = oldRect.Size.Width; Rect.Width = newRect.Width - oldRect.Width; } else { Rect.X = newRect.Size.Width; Rect.Width = oldRect.Width - newRect.Width; } Invalidate(Rect); } } } public Color Color { get { return m_Colour; } set { if (m_Colour != value) { m_Colour = value; Invalidate(); } } } protected override void OnResize(EventArgs e) { Invalidate(); } protected override void OnPaint(PaintEventArgs e) { using (var gr = e.Graphics) { using (var br = new SolidBrush(m_Colour)) { var Fill = (m_Value - m_Minimum)/(float) (m_Maximum - m_Minimum); var Rect = ClientRectangle; Rect.Width = (int) (Rect.Width*Fill); gr.FillRectangle(br, Rect); } } } } }