#region Imports using DPumpHydr.WinFrmUI.RLT.Properties; 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 ParrotButton public class ParrotButton : Control { public ParrotButton() { base.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); base.Size = new Size(200, 50); CurrentBackColor = backColor; CurrentForeColor = foreColor; BackColor = Color.Transparent; Cursor = Cursors.Hand; } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public new Color BackColor { get; set; } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public new Color ForeColor { get; set; } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public new string Text { get; set; } [Category("Parrot")] [Browsable(true)] [Description("The button style")] public Style ButtonStyle { get => buttonStyle; set { buttonStyle = value; if (buttonStyle == Style.Dark) { CurrentBackColor = Color.FromArgb(65, 70, 75); CurrentForeColor = Color.FromArgb(195, 200, 185); } if (buttonStyle == Style.MacOS) { CurrentBackColor = Color.White; CurrentForeColor = Color.Black; } Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text color of the button")] public Color TextColor { get => foreColor; set { foreColor = value; CurrentForeColor = foreColor; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The background color of the button")] public Color BackgroundColor { get => backColor; set { backColor = value; CurrentBackColor = backColor; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text color of the button while the mouse is over it")] public Color HoverTextColor { get => hoverForeColor; set { hoverForeColor = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The background color of the button while the mouse is over it")] public Color HoverBackgroundColor { get => hoverBackgroundColor; set { hoverBackgroundColor = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text color of the button when clicked")] public Color ClickTextColor { get => clickForecolor; set { clickForecolor = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The background color of the button when clicked")] public Color ClickBackColor { get => clickBackcolor; set { clickBackcolor = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The corner radius if rounded edges")] public int CornerRadius { get => cornerRadius; set { cornerRadius = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text of the button")] public string ButtonText { get => buttonText; set { buttonText = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text horizontal alignment")] public StringAlignment Horizontal_Alignment { get => horizontalAlignment; set { horizontalAlignment = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The text vertical alignment")] public StringAlignment Vertical_Alignment { get => verticlAlignment; set { verticlAlignment = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("The buttons image")] public Image ButtonImage { get => buttonImage; set { buttonImage = value; Invalidate(); } } [Category("Parrot")] [Browsable(true)] [Description("Button image position")] public ImgPosition ImagePosition { get => imagePosition; set { imagePosition = value; Invalidate(); } } private SmoothingMode _SmoothingType = SmoothingMode.HighQuality; [Category("Parrot")] [Browsable(true)] public SmoothingMode SmoothingType { get => _SmoothingType; set { _SmoothingType = value; Invalidate(); } } private TextRenderingHint _TextRenderingType = TextRenderingHint.ClearTypeGridFit; [Category("Parrot")] [Browsable(true)] public TextRenderingHint TextRenderingType { get => _TextRenderingType; set { _TextRenderingType = value; Invalidate(); } } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); CurrentForeColor = hoverForeColor; CurrentBackColor = hoverBackgroundColor; Invalidate(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); CurrentForeColor = foreColor; CurrentBackColor = backColor; Invalidate(); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); CurrentForeColor = clickForecolor; CurrentBackColor = clickBackcolor; Invalidate(); } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); CurrentForeColor = foreColor; CurrentBackColor = backColor; Invalidate(); } private void FillRoundedRectangle(Graphics Gfx, Color ButtonColor, int CornerRadius) { using GraphicsPath graphicsPath = new(); graphicsPath.AddArc(base.Width - (CornerRadius * 2) - 2, 0, CornerRadius * 2, CornerRadius * 2, 270f, 90f); graphicsPath.AddArc(base.Width - (CornerRadius * 2) - 2, base.Height - (CornerRadius * 2), CornerRadius * 2, (CornerRadius * 2) - 2, 0f, 90f); graphicsPath.AddArc(0, base.Height - (CornerRadius * 2) - 2, (CornerRadius * 2) - 2, CornerRadius * 2, 90f, 90f); graphicsPath.AddArc(0, 0, CornerRadius * 2, CornerRadius * 2, 180f, 90f); graphicsPath.CloseFigure(); Gfx.FillPath(new SolidBrush(ButtonColor), graphicsPath); } private void DrawRoundedRectangle(Graphics Gfx, Color borderColor, int CornerRadius, int borderThickness) { using GraphicsPath graphicsPath = new(); graphicsPath.AddArc(base.Width - (CornerRadius * 2) - 2, 0, CornerRadius * 2, CornerRadius * 2, 270f, 90f); graphicsPath.AddArc(base.Width - (CornerRadius * 2) - 2, base.Height - (CornerRadius * 2), CornerRadius * 2, (CornerRadius * 2) - 2, 0f, 90f); graphicsPath.AddArc(0, base.Height - (CornerRadius * 2) - 2, (CornerRadius * 2) - 2, CornerRadius * 2, 90f, 90f); graphicsPath.AddArc(0, 0, CornerRadius * 2, CornerRadius * 2, 180f, 90f); graphicsPath.CloseFigure(); Gfx.DrawPath(new Pen(borderColor, borderThickness), graphicsPath); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.SmoothingMode = SmoothingType; e.Graphics.TextRenderingHint = TextRenderingType; if (buttonStyle == Style.MaterialEllipse) { e.Graphics.FillPie(new SolidBrush(CurrentBackColor), 0, 0, base.Width - 1, base.Height - 1, 0, 360); } if (buttonStyle == Style.Material) { e.Graphics.FillRectangle(new SolidBrush(CurrentBackColor), 0, 0, base.Width, base.Height); } if (buttonStyle == Style.MaterialRounded) { if ((Height / 2) - 1 != 0) { FillRoundedRectangle(e.Graphics, CurrentBackColor, cornerRadius); } else { FillRoundedRectangle(e.Graphics, CurrentBackColor, cornerRadius); } } if (buttonStyle == Style.Invert) { if ((Height / 2) - 1 != 0) { FillRoundedRectangle(e.Graphics, CurrentBackColor, (Height / 2) - 1); } else { FillRoundedRectangle(e.Graphics, CurrentBackColor, Height / 2); } if ((Height / 2) - 1 != 0) { DrawRoundedRectangle(e.Graphics, CurrentForeColor, (Height / 2) - 1, 2); } else { DrawRoundedRectangle(e.Graphics, CurrentForeColor, Height / 2, 2); } hoverBackgroundColor = foreColor; hoverForeColor = backColor; clickBackcolor = foreColor; clickForecolor = foreColor; } if (buttonStyle == Style.Dark) { backColor = Color.FromArgb(65, 70, 75); foreColor = Color.FromArgb(195, 200, 185); hoverBackgroundColor = Color.FromArgb(75, 80, 90); hoverForeColor = Color.FromArgb(235, 235, 215); clickBackcolor = Color.FromArgb(65, 75, 80); clickForecolor = Color.FromArgb(125, 130, 140); if ((Height / 2) - 1 != 0) { FillRoundedRectangle(e.Graphics, CurrentBackColor, (Height / 2) - 1); } else { FillRoundedRectangle(e.Graphics, CurrentBackColor, Height / 2); } if ((Height / 2) - 1 != 0) { DrawRoundedRectangle(e.Graphics, Color.Black, (Height / 2) - 1, 1); } else { DrawRoundedRectangle(e.Graphics, Color.Black, Height / 2, 1); } } if (buttonStyle == Style.MacOS) { backColor = Color.White; foreColor = Color.Black; Font = new Font("Microsoft Sans Serif", 14f); if ((Height / 2) - 1 != 0) { FillRoundedRectangle(e.Graphics, CurrentBackColor, 8); } else { FillRoundedRectangle(e.Graphics, CurrentBackColor, 8); } if ((Height / 2) - 1 != 0) { DrawRoundedRectangle(e.Graphics, Color.FromArgb(163, 163, 163), 8, 2); } else { DrawRoundedRectangle(e.Graphics, Color.FromArgb(163, 163, 163), 8, 2); } } Rectangle r = new(0, 0, base.Width, base.Height); if (buttonStyle != Style.Dark && buttonStyle != Style.MaterialEllipse && buttonStyle != Style.MacOS && buttonStyle != Style.Invert && buttonImage != null) { if (imagePosition == ImgPosition.Left) { r = new Rectangle(base.Height, 0, base.Width - base.Height, base.Height); e.Graphics.DrawImage(new Bitmap(buttonImage, base.Height - 2, base.Height - 2), 1, 1); } if (imagePosition == ImgPosition.Right) { r = new Rectangle(0, 0, base.Width - base.Height, base.Height); e.Graphics.DrawImage(new Bitmap(buttonImage, base.Height - 2, base.Height - 2), base.Width - base.Height, 1); } if (imagePosition == ImgPosition.Center) { e.Graphics.DrawImage(new Bitmap(buttonImage, base.Height - 2, base.Height - 2), (base.Width / 2) - (Height / 2), 1); } } if (imagePosition != ImgPosition.Center || buttonImage == null) { StringFormat stringFormat = new() { LineAlignment = verticlAlignment, Alignment = horizontalAlignment }; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; e.Graphics.DrawString(buttonText, Font, new SolidBrush(CurrentForeColor), r, stringFormat); } } private Color CurrentBackColor; private Color CurrentForeColor; private Style buttonStyle = Style.MaterialRounded; private Color foreColor = Color.DodgerBlue; private Color backColor = Color.FromArgb(255, 255, 255); private Color hoverForeColor = Color.DodgerBlue; private Color hoverBackgroundColor = Color.FromArgb(225, 225, 225); private Color clickForecolor = Color.DodgerBlue; private Color clickBackcolor = Color.FromArgb(195, 195, 195); private int cornerRadius = 5; private string buttonText = "Button"; private StringAlignment horizontalAlignment = StringAlignment.Center; private StringAlignment verticlAlignment = StringAlignment.Center; private Image buttonImage = Resources.mini_button; public ImgPosition imagePosition; public enum ImgPosition { Left, Right, Center } public enum Style { Material, Dark, MacOS, Invert, MaterialRounded, MaterialEllipse } } #endregion }