#region Imports using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region Button public class Button : Control { #region Variables private int MouseState; private GraphicsPath Shape; private LinearGradientBrush InactiveGB; private LinearGradientBrush PressedGB; private LinearGradientBrush EnteredGB; private Rectangle R1; private Image _Image; private Size _ImageSize; private StringAlignment _TextAlignment = StringAlignment.Center; private Color _InactiveColor = Color.FromArgb(32, 34, 37); private Color _PressedColor = Color.FromArgb(165, 37, 37); private Color _EnteredColor = Color.FromArgb(32, 34, 37); private Color _BorderColor = Color.FromArgb(32, 34, 37); private Color _EnteredBorderColor = Color.FromArgb(165, 37, 37); private Color _PressedBorderColor = Color.FromArgb(165, 37, 37); private Color _TextColor; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors. private ContentAlignment _ImageAlign = ContentAlignment.MiddleLeft; #endregion #region Image Designer private static PointF ImageLocation(StringFormat SF, SizeF Area, SizeF ImageArea) { PointF MyPoint = new(); switch (SF.Alignment) { case StringAlignment.Center: MyPoint.X = (float)((Area.Width - ImageArea.Width) / 2); break; case StringAlignment.Near: MyPoint.X = 2; break; case StringAlignment.Far: MyPoint.X = Area.Width - ImageArea.Width - 2; break; } switch (SF.LineAlignment) { case StringAlignment.Center: MyPoint.Y = (float)((Area.Height - ImageArea.Height) / 2); break; case StringAlignment.Near: MyPoint.Y = 2; break; case StringAlignment.Far: MyPoint.Y = Area.Height - ImageArea.Height - 2; break; } return MyPoint; } private StringFormat GetStringFormat(ContentAlignment _ContentAlignment) { StringFormat SF = new(); switch (_ContentAlignment) { case ContentAlignment.MiddleCenter: SF.LineAlignment = StringAlignment.Center; SF.Alignment = StringAlignment.Center; break; case ContentAlignment.MiddleLeft: SF.LineAlignment = StringAlignment.Center; SF.Alignment = StringAlignment.Near; break; case ContentAlignment.MiddleRight: SF.LineAlignment = StringAlignment.Center; SF.Alignment = StringAlignment.Far; break; case ContentAlignment.TopCenter: SF.LineAlignment = StringAlignment.Near; SF.Alignment = StringAlignment.Center; break; case ContentAlignment.TopLeft: SF.LineAlignment = StringAlignment.Near; SF.Alignment = StringAlignment.Near; break; case ContentAlignment.TopRight: SF.LineAlignment = StringAlignment.Near; SF.Alignment = StringAlignment.Far; break; case ContentAlignment.BottomCenter: SF.LineAlignment = StringAlignment.Far; SF.Alignment = StringAlignment.Center; break; case ContentAlignment.BottomLeft: SF.LineAlignment = StringAlignment.Far; SF.Alignment = StringAlignment.Near; break; case ContentAlignment.BottomRight: SF.LineAlignment = StringAlignment.Far; SF.Alignment = StringAlignment.Far; break; } return SF; } #endregion #region Properties public Image Image { get => _Image; set { if (value == null) { _ImageSize = Size.Empty; } else { _ImageSize = value.Size; } _Image = value; Invalidate(); } } protected Size ImageSize => _ImageSize; public ContentAlignment ImageAlign { get => _ImageAlign; set { _ImageAlign = value; Invalidate(); } } public StringAlignment TextAlignment { get => _TextAlignment; set { _TextAlignment = value; Invalidate(); } } public override Color ForeColor { get => _TextColor; set { _TextColor = value; Invalidate(); } } public Color InactiveColor { get => _InactiveColor; set { InactiveGB = new(new Rectangle(0, 0, Width, Height), value, value, 90.0F); _InactiveColor = value; Invalidate(); } } public Color PressedColor { get => _PressedColor; set { PressedGB = new(new Rectangle(0, 0, Width, Height), value, value, 90.0F); _PressedColor = value; Invalidate(); } } public Color EnteredColor { get => _EnteredColor; set { EnteredGB = new(new Rectangle(0, 0, Width, Height), value, value, 90.0F); _EnteredColor = value; Invalidate(); } } public Color BorderColor { get => _BorderColor; set { _BorderColor = value; Invalidate(); } } public Color EnteredBorderColor { get => _EnteredBorderColor; set { _EnteredBorderColor = value; Invalidate(); } } public Color PressedBorderColor { get => _PressedBorderColor; set { _PressedBorderColor = value; Invalidate(); } } #endregion #region EventArgs protected override void OnMouseUp(MouseEventArgs e) { MouseState = 2; Invalidate(); base.OnMouseUp(e); } /*protected override void OnMouseMove(MouseEventArgs e) { if (Enabled == true) Cursor = Cursors.Hand; else Cursor = Cursors.No; base.OnMouseMove(e); }*/ protected override void OnMouseEnter(EventArgs e) { MouseState = 2; Invalidate(); base.OnMouseEnter(e); } protected override void OnMouseDown(MouseEventArgs e) { MouseState = 1; Focus(); Invalidate(); base.OnMouseDown(e); } protected override void OnMouseLeave(EventArgs e) { MouseState = 0; Invalidate(); base.OnMouseLeave(e); } protected override void OnTextChanged(EventArgs e) { Invalidate(); base.OnTextChanged(e); } #endregion public Button() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true); BackColor = Color.Transparent; Cursor = Cursors.Hand; DoubleBuffered = true; Font = new("Microsoft Sans Serif", 12); ForeColor = Color.FromArgb(255, 255, 255); Size = new(120, 40); _TextAlignment = StringAlignment.Center; } protected override void OnResize(EventArgs e) { base.OnResize(e); if (Width > 0 && Height > 0) { Shape = new(); R1 = new(0, 0, Width, Height); EnteredGB = new(new Rectangle(0, 0, Width, Height), EnteredColor, EnteredColor, 90.0F); PressedGB = new(new Rectangle(0, 0, Width, Height), PressedColor, PressedColor, 90.0F); InactiveGB = new(new Rectangle(0, 0, Width, Height), InactiveColor, InactiveColor, 90.0F); } Shape.AddArc(0, 0, 10, 10, 180, 90); Shape.AddArc(Width - 11, 0, 10, 10, -90, 90); Shape.AddArc(Width - 11, Height - 11, 10, 10, 0, 90); Shape.AddArc(0, Height - 11, 10, 10, 90, 90); Shape.CloseAllFigures(); Invalidate(); } protected override void OnPaint(PaintEventArgs e) { Graphics G = e.Graphics; G.SmoothingMode = SmoothingMode.HighQuality; PointF ipt = ImageLocation(GetStringFormat(ImageAlign), Size, ImageSize); switch (MouseState) { case 0: //Inactive G.FillPath(InactiveGB, Shape); // Fill button body with InactiveGB color gradient G.DrawPath(new(BorderColor), Shape); // Draw button border [InactiveGB] if (Image == null) { G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } else { G.DrawImage(_Image, ipt.X, ipt.Y, ImageSize.Width, ImageSize.Height); G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } break; case 1: //Pressed G.FillPath(PressedGB, Shape); // Fill button body with PressedGB color gradient G.DrawPath(new(PressedBorderColor), Shape); // Draw button border [PressedGB] if (Image == null) { G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } else { G.DrawImage(_Image, ipt.X, ipt.Y, ImageSize.Width, ImageSize.Height); G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } break; case 2: //Entered G.FillPath(EnteredGB, Shape); // Fill button body with EnteredGB color gradient G.DrawPath(new(EnteredBorderColor), Shape); // Draw button border [EnteredGB] if (Image == null) { G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } else { G.DrawImage(_Image, ipt.X, ipt.Y, ImageSize.Width, ImageSize.Height); G.DrawString(Text, Font, new SolidBrush(ForeColor), R1, new StringFormat { Alignment = _TextAlignment, LineAlignment = StringAlignment.Center }); } break; } base.OnPaint(e); } } #endregion }