#region Imports using DPumpHydr.WinFrmUI.RLT.Design.Metro; using DPumpHydr.WinFrmUI.RLT.Enum.Metro; using DPumpHydr.WinFrmUI.RLT.Extension.Metro; using DPumpHydr.WinFrmUI.RLT.Interface.Metro; using DPumpHydr.WinFrmUI.RLT.Manager; using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Text; using System.Runtime.InteropServices; using System.Windows.Forms; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region MetroControlBox [ToolboxItem(true)] [ToolboxBitmap(typeof(MetroControlBox), "Bitmaps.ControlButton.bmp")] [Designer(typeof(MetroControlBoxDesigner))] [DefaultProperty("Click")] [ComVisible(true)] public class MetroControlBox : Control, IMetroControl { #region Interfaces [Category("Metro"), Description("Gets or sets the style associated with the control.")] public Style Style { get => StyleManager?.Style ?? _style; set { _style = value; switch (value) { case Style.Light: ApplyTheme(); break; case Style.Dark: ApplyTheme(Style.Dark); break; case Style.Custom: ApplyTheme(Style.Custom); break; default: ApplyTheme(); break; } Invalidate(); } } [Category("Metro"), Description("Gets or sets the Style Manager associated with the control.")] public MetroStyleManager StyleManager { get => _styleManager; set { _styleManager = value; Invalidate(); } } [Category("Metro"), Description("Gets or sets the The Author name associated with the theme.")] public string ThemeAuthor { get; set; } [Category("Metro"), Description("Gets or sets the The Theme name associated with the theme.")] public string ThemeName { get; set; } #endregion Interfaces #region Global Vars private readonly Utilites _utl; #endregion Global Vars #region Internal Vars private Style _style; private MetroStyleManager _styleManager; private bool _isDerivedStyle = true; private bool _maximizeBox = true; private Color _closeNormalForeColor; private Color _closeHoverForeColor; private Color _closeHoverBackColor; private Color _maximizeHoverForeColor; private Color _maximizeHoverBackColor; private Color _maximizeNormalForeColor; private Color _minimizeHoverForeColor; private Color _minimizeHoverBackColor; private Color _minimizeNormalForeColor; private Color _disabledForeColor; #endregion Internal Vars #region Constructors public MetroControlBox() { SetStyle ( ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true ); UpdateStyles(); _utl = new Utilites(); base.Anchor = AnchorStyles.Top | AnchorStyles.Right; Cursor = Cursors.Hand; ApplyTheme(); } #endregion Constructors #region ApplyTheme private void ApplyTheme(Style style = Style.Light) { if (!IsDerivedStyle) { return; } switch (style) { case Style.Light: CloseHoverBackColor = Color.FromArgb(183, 40, 40); CloseHoverForeColor = Color.White; CloseNormalForeColor = Color.Gray; MaximizeHoverBackColor = Color.FromArgb(238, 238, 238); MaximizeHoverForeColor = Color.Gray; MaximizeNormalForeColor = Color.Gray; MinimizeHoverBackColor = Color.FromArgb(238, 238, 238); MinimizeHoverForeColor = Color.Gray; MinimizeNormalForeColor = Color.Gray; DisabledForeColor = Color.DimGray; ThemeAuthor = "Taiizor"; ThemeName = "MetroLight"; break; case Style.Dark: CloseHoverBackColor = Color.FromArgb(183, 40, 40); CloseHoverForeColor = Color.White; CloseNormalForeColor = Color.Gray; MaximizeHoverBackColor = Color.FromArgb(238, 238, 238); MaximizeHoverForeColor = Color.Gray; MaximizeNormalForeColor = Color.Gray; MinimizeHoverBackColor = Color.FromArgb(238, 238, 238); MinimizeHoverForeColor = Color.Gray; MinimizeNormalForeColor = Color.Gray; DisabledForeColor = Color.Silver; ThemeAuthor = "Taiizor"; ThemeName = "MetroDark"; break; case Style.Custom: if (StyleManager != null) { foreach (System.Collections.Generic.KeyValuePair varkey in StyleManager.ControlBoxDictionary) { switch (varkey.Key) { case "CloseHoverBackColor": CloseHoverBackColor = _utl.HexColor((string)varkey.Value); break; case "CloseHoverForeColor": CloseHoverForeColor = _utl.HexColor((string)varkey.Value); break; case "CloseNormalForeColor": CloseNormalForeColor = _utl.HexColor((string)varkey.Value); break; case "MaximizeHoverBackColor": MaximizeHoverBackColor = _utl.HexColor((string)varkey.Value); break; case "MaximizeHoverForeColor": MaximizeHoverForeColor = _utl.HexColor((string)varkey.Value); break; case "MaximizeNormalForeColor": MaximizeNormalForeColor = _utl.HexColor((string)varkey.Value); break; case "MinimizeHoverBackColor": MinimizeHoverBackColor = _utl.HexColor((string)varkey.Value); break; case "MinimizeHoverForeColor": MinimizeHoverForeColor = _utl.HexColor((string)varkey.Value); break; case "MinimizeNormalForeColor": MinimizeNormalForeColor = _utl.HexColor((string)varkey.Value); break; case "DisabledForeColor": DisabledForeColor = _utl.HexColor((string)varkey.Value); break; default: return; } } } break; default: throw new ArgumentOutOfRangeException(nameof(style), style, null); } Invalidate(); } #endregion Theme Changing #region Properties #region Public [Category("Metro"), Description("Gets or sets the Default Location associated with the control.")] public LocationType DefaultLocation { get; set; } = LocationType.Normal; [Category("Metro")] [Description("Gets or sets the whether this control reflect to parent(s) style. \n " + "Set it to false if you want the style of this control be independent. ")] public bool IsDerivedStyle { get => _isDerivedStyle; set { _isDerivedStyle = value; Refresh(); } } [Category("Metro"), Description("Gets or sets a value indicating whether the Maximize button is Enabled in the caption bar of the form.")] public bool MaximizeBox { get => _maximizeBox; set { _maximizeBox = value; Refresh(); } } [Category("Metro"), Description("Gets or sets a value indicating whether the Minimize button is Enabled in the caption bar of the form.")] private bool _minimizeBox = true; public bool MinimizeBox { get => _minimizeBox; set { _minimizeBox = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Close forecolor used by the control.")] public Color CloseNormalForeColor { get => _closeNormalForeColor; set { _closeNormalForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Close forecolor used by the control.")] public Color CloseHoverForeColor { get => _closeHoverForeColor; set { _closeHoverForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Close backcolor used by the control.")] public Color CloseHoverBackColor { get => _closeHoverBackColor; set { _closeHoverBackColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Maximize forecolor used by the control.")] public Color MaximizeHoverForeColor { get => _maximizeHoverForeColor; set { _maximizeHoverForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Maximize backcolor used by the control.")] public Color MaximizeHoverBackColor { get => _maximizeHoverBackColor; set { _maximizeHoverBackColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Maximize forecolor used by the control.")] public Color MaximizeNormalForeColor { get => _maximizeNormalForeColor; set { _maximizeNormalForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Minimize forecolor used by the control.")] public Color MinimizeHoverForeColor { get => _minimizeHoverForeColor; set { _minimizeHoverForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Minimize backcolor used by the control.")] public Color MinimizeHoverBackColor { get => _minimizeHoverBackColor; set { _minimizeHoverBackColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets Minimize forecolor used by the control.")] public Color MinimizeNormalForeColor { get => _minimizeNormalForeColor; set { _minimizeNormalForeColor = value; Refresh(); } } [Category("Metro"), Description("Gets or sets disabled forecolor used by the control.")] public Color DisabledForeColor { get => _disabledForeColor; set { _disabledForeColor = value; Refresh(); } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Color BackColor => Color.Transparent; #endregion #region Private private bool MinimizeHovered { get; set; } private bool MaximizeHovered { get; set; } private bool CloseHovered { get; set; } #endregion #endregion #region Draw Control protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; using (SolidBrush closeBoxState = new(CloseHovered ? CloseHoverBackColor : Color.Transparent)) { using Font f = new(@"Marlett", 12); using SolidBrush tb = new(CloseHovered ? CloseHoverForeColor : CloseNormalForeColor); using StringFormat sf = new() { Alignment = StringAlignment.Center }; g.FillRectangle(closeBoxState, new Rectangle(70, 5, 27, Height)); g.DrawString("r", f, CloseHovered ? tb : Brushes.Gray, new Point(Width - 16, 8), sf); } using (SolidBrush maximizeBoxState = new(MaximizeBox ? MaximizeHovered ? MaximizeHoverBackColor : Color.Transparent : Color.Transparent)) { using Font f = new(@"Marlett", 12); using SolidBrush tb = new(MaximizeBox ? MaximizeHovered ? MaximizeHoverForeColor : MaximizeNormalForeColor : DisabledForeColor); string maxSymbol = Parent.FindForm()?.WindowState == FormWindowState.Maximized ? "2" : "1"; using StringFormat sf = new() { Alignment = StringAlignment.Center }; g.FillRectangle(maximizeBoxState, new Rectangle(38, 5, 24, Height)); g.DrawString(maxSymbol, f, tb, new Point(51, 7), sf); } using (SolidBrush minimizeBoxState = new(MinimizeBox ? MinimizeHovered ? MinimizeHoverBackColor : Color.Transparent : Color.Transparent)) { using Font f = new(@"Marlett", 12); using SolidBrush tb = new(MinimizeBox ? MinimizeHovered ? MinimizeHoverForeColor : MinimizeNormalForeColor : DisabledForeColor); using StringFormat sf = new() { Alignment = StringAlignment.Center }; g.FillRectangle(minimizeBoxState, new Rectangle(5, 5, 27, Height)); g.DrawString("0", f, tb, new Point(20, 7), sf); } } #endregion #region Events protected override void OnCreateControl() { base.OnCreateControl(); try { switch (DefaultLocation) { case LocationType.Space: Location = new(Parent.Width - Width - 12, 13); break; case LocationType.Edge: Location = new(Parent.Width - Width, 0); break; default: break; } } catch (Exception) { // } } protected override void OnResize(EventArgs e) { base.OnResize(e); Size = new(100, 25); } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (e.Location.Y > 0 && e.Location.Y < (Height - 2)) { if (e.Location.X is > 0 and < 34) { MinimizeHovered = true; MaximizeHovered = false; CloseHovered = false; } else if (e.Location.X is > 33 and < 65) { MinimizeHovered = false; MaximizeHovered = true; CloseHovered = false; } else if (e.Location.X > 64 && e.Location.X < Width) { MinimizeHovered = false; MaximizeHovered = false; CloseHovered = true; } else { MinimizeHovered = false; MaximizeHovered = false; CloseHovered = false; } } Invalidate(); } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseDown(e); if (CloseHovered) { Parent.FindForm()?.Close(); } else if (MinimizeHovered) { if (!MinimizeBox) { return; } Parent.FindForm().WindowState = FormWindowState.Minimized; } else if (MaximizeHovered) { if (MaximizeBox) { Parent.FindForm().WindowState = Parent.FindForm()?.WindowState == FormWindowState.Normal ? FormWindowState.Maximized : FormWindowState.Normal; } } } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); MinimizeHovered = false; MaximizeHovered = false; CloseHovered = false; Invalidate(); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); Focus(); } #endregion } #endregion }