#region Imports
|
|
using System;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Windows.Forms;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Controls
|
{
|
#region TrackBar
|
|
[DefaultEvent("ValueChanged")]
|
public class TrackBar : Control
|
{
|
|
#region Enums
|
|
public enum ValueDivisor
|
{
|
By1 = 1,
|
By10 = 10,
|
By100 = 100,
|
By1000 = 1000
|
}
|
|
#endregion
|
#region Variables
|
|
private Rectangle FillValue;
|
private Rectangle PipeBorder;
|
private Rectangle TrackBarHandleRect;
|
private bool Cap;
|
private int ValueDrawer;
|
|
private Size ThumbSize = new(14, 14);
|
private Rectangle TrackThumb;
|
|
private int _Minimum = 0;
|
private int _Maximum = 10;
|
private int _Value = 0;
|
|
private bool _JumpToMouse = false;
|
private ValueDivisor DividedValue = ValueDivisor.By1;
|
|
#endregion
|
#region Properties
|
|
public int Minimum
|
{
|
get => _Minimum;
|
set
|
{
|
|
if (value >= _Maximum)
|
{
|
value = _Maximum - 10;
|
}
|
|
if (_Value < value)
|
{
|
_Value = value;
|
}
|
|
_Minimum = value;
|
Invalidate();
|
}
|
}
|
|
public int Maximum
|
{
|
get => _Maximum;
|
set
|
{
|
|
if (value <= _Minimum)
|
{
|
value = _Minimum + 10;
|
}
|
|
if (_Value > value)
|
{
|
_Value = value;
|
}
|
|
_Maximum = value;
|
Invalidate();
|
}
|
}
|
|
public delegate void ValueChangedEventHandler();
|
private ValueChangedEventHandler ValueChangedEvent;
|
|
public event ValueChangedEventHandler ValueChanged
|
{
|
add => ValueChangedEvent = (ValueChangedEventHandler)System.Delegate.Combine(ValueChangedEvent, value);
|
remove => ValueChangedEvent = (ValueChangedEventHandler)System.Delegate.Remove(ValueChangedEvent, value);
|
}
|
|
public int Value
|
{
|
get => _Value;
|
set
|
{
|
if (_Value != value)
|
{
|
if (value < _Minimum)
|
{
|
_Value = _Minimum;
|
}
|
else
|
{
|
if (value > _Maximum)
|
{
|
_Value = _Maximum;
|
}
|
else
|
{
|
_Value = value;
|
}
|
}
|
Invalidate();
|
ValueChangedEvent?.Invoke();
|
}
|
}
|
}
|
|
public ValueDivisor ValueDivison
|
{
|
get => DividedValue;
|
set
|
{
|
DividedValue = value;
|
Invalidate();
|
}
|
}
|
|
[Browsable(false)]
|
public float ValueToSet
|
{
|
get => _Value / (int)DividedValue;
|
set => Value = (int)(value * (int)DividedValue);
|
}
|
|
public bool JumpToMouse
|
{
|
get => _JumpToMouse;
|
set
|
{
|
_JumpToMouse = value;
|
Invalidate();
|
}
|
}
|
|
#endregion
|
#region EventArgs
|
|
protected override void OnMouseMove(MouseEventArgs e)
|
{
|
base.OnMouseMove(e);
|
checked
|
{
|
bool flag = Cap && e.X > -1 && e.X < Width + 1;
|
if (flag)
|
{
|
Value = _Minimum + (int)Math.Round((_Maximum - _Minimum) * (e.X / (double)Width));
|
}
|
}
|
}
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
{
|
base.OnMouseDown(e);
|
if (e.Button == MouseButtons.Left)
|
{
|
ValueDrawer = (int)Math.Round((_Value - _Minimum) / (double)(_Maximum - _Minimum) * (Width - 11));
|
TrackBarHandleRect = new(ValueDrawer, 0, 25, 25);
|
Cap = TrackBarHandleRect.Contains(e.Location);
|
Focus();
|
if (_JumpToMouse)
|
{
|
Value = _Minimum + (int)Math.Round((_Maximum - _Minimum) * (e.X / (double)Width));
|
}
|
}
|
}
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
{
|
base.OnMouseUp(e);
|
Cap = false;
|
}
|
|
#endregion
|
|
public TrackBar()
|
{
|
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true);
|
|
Size = new(80, 22);
|
MinimumSize = new(47, 22);
|
}
|
|
protected override void OnResize(EventArgs e)
|
{
|
base.OnResize(e);
|
Height = 22;
|
}
|
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
base.OnPaint(e);
|
Graphics G = e.Graphics;
|
|
G.Clear(Parent.BackColor);
|
G.SmoothingMode = SmoothingMode.AntiAlias;
|
TrackThumb = new(7, 10, Width - 16, 2);
|
PipeBorder = new(1, 10, Width - 3, 2);
|
|
try
|
{
|
ValueDrawer = (int)Math.Round((_Value - _Minimum) / (double)(_Maximum - _Minimum) * Width);
|
}
|
catch (Exception)
|
{
|
//
|
}
|
|
TrackBarHandleRect = new(ValueDrawer, 0, 3, 20);
|
|
G.FillRectangle(new SolidBrush(Color.FromArgb(124, 131, 137)), PipeBorder);
|
FillValue = new(0, 10, TrackBarHandleRect.X + TrackBarHandleRect.Width - 4, 3);
|
|
G.ResetClip();
|
|
G.SmoothingMode = SmoothingMode.Default;
|
G.DrawRectangle(new(Color.FromArgb(124, 131, 137)), PipeBorder); // Draw pipe border
|
G.FillRectangle(new SolidBrush(Color.FromArgb(32, 34, 37)), FillValue);
|
|
G.ResetClip();
|
|
G.SmoothingMode = SmoothingMode.HighQuality;
|
|
G.FillEllipse(new SolidBrush(Color.FromArgb(32, 34, 37)), TrackThumb.X + (int)Math.Round(unchecked(TrackThumb.Width * (Value / (double)Maximum))) - (int)Math.Round(ThumbSize.Width / 2.0), TrackThumb.Y + (int)Math.Round(TrackThumb.Height / 2.0) - (int)Math.Round(ThumbSize.Height / 2.0), ThumbSize.Width, ThumbSize.Height);
|
G.DrawEllipse(new(Color.FromArgb(32, 34, 37)), TrackThumb.X + (int)Math.Round(unchecked(TrackThumb.Width * (Value / (double)Maximum))) - (int)Math.Round(ThumbSize.Width / 2.0), TrackThumb.Y + (int)Math.Round(TrackThumb.Height / 2.0) - (int)Math.Round(ThumbSize.Height / 2.0), ThumbSize.Width, ThumbSize.Height);
|
}
|
}
|
|
#endregion
|
}
|