#region Imports using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Windows.Forms; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region Toggle Button [DefaultEvent("ToggledChanged")] public class ToggleButton : Control { #region Enums public enum _Type { CheckMark, OnOff, YesNo, IO } #endregion #region Variables public delegate void ToggledChangedEventHandler(); private ToggledChangedEventHandler ToggledChangedEvent; public event ToggledChangedEventHandler ToggledChanged { add => ToggledChangedEvent = (ToggledChangedEventHandler)Delegate.Combine(ToggledChangedEvent, value); remove => ToggledChangedEvent = (ToggledChangedEventHandler)Delegate.Remove(ToggledChangedEvent, value); } private bool _Toggled; private _Type ToggleType; private Rectangle Bar; private int _Width; private int _Height; #endregion #region Properties public bool Toggled { get => _Toggled; set { _Toggled = value; Invalidate(); ToggledChangedEvent?.Invoke(); } } public _Type Type { get => ToggleType; set { ToggleType = value; Invalidate(); } } #endregion #region EventArgs protected override void OnResize(EventArgs e) { base.OnResize(e); Size = new(76, 33); } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); Toggled = !Toggled; Focus(); } #endregion public ToggleButton() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); Cursor = Cursors.Hand; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics G = e.Graphics; G.SmoothingMode = SmoothingMode.HighQuality; G.Clear(Parent.BackColor); _Width = Width - 1; _Height = Height - 1; GraphicsPath GP = default; GraphicsPath GP2 = new(); Rectangle BaseRect = new(0, 0, _Width, _Height); Rectangle ThumbRect = new(_Width / 2, 0, 38, _Height); G.SmoothingMode = (SmoothingMode)2; G.PixelOffsetMode = (PixelOffsetMode)2; G.TextRenderingHint = (TextRenderingHint)5; G.Clear(BackColor); GP = RoundRectangle.RoundRect(BaseRect, 4); ThumbRect = new(4, 4, 36, _Height - 8); GP2 = RoundRectangle.RoundRect(ThumbRect, 4); G.FillPath(new SolidBrush(Color.FromArgb(66, 76, 85)), GP); G.FillPath(new SolidBrush(Color.FromArgb(32, 41, 50)), GP2); if (_Toggled) { GP = RoundRectangle.RoundRect(BaseRect, 4); ThumbRect = new((_Width / 2) - 2, 4, 36, _Height - 8); GP2 = RoundRectangle.RoundRect(ThumbRect, 4); G.FillPath(new SolidBrush(Color.FromArgb(32, 34, 37)), GP); G.FillPath(new SolidBrush(Color.FromArgb(32, 41, 50)), GP2); } // Draw string switch (ToggleType) { case _Type.CheckMark: if (Toggled) { G.DrawString("ΓΌ", new Font("Wingdings", 18, FontStyle.Regular), Brushes.WhiteSmoke, Bar.X + 18, Bar.Y + 19, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } else { G.DrawString("r", new Font("Marlett", 14, FontStyle.Regular), Brushes.DimGray, Bar.X + 59, Bar.Y + 18, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } break; case _Type.OnOff: if (Toggled) { G.DrawString("ON", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.WhiteSmoke, Bar.X + 18, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } else { G.DrawString("OFF", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.DimGray, Bar.X + 57, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } break; case _Type.YesNo: if (Toggled) { G.DrawString("YES", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.WhiteSmoke, Bar.X + 19, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } else { G.DrawString("NO", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.DimGray, Bar.X + 56, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } break; case _Type.IO: if (Toggled) { G.DrawString("I", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.WhiteSmoke, Bar.X + 18, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } else { G.DrawString("O", new Font("Microsoft Sans Serif", 12, FontStyle.Regular), Brushes.DimGray, Bar.X + 57, Bar.Y + 16, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); } break; } } } #endregion }