#region Imports using DPumpHydr.WinFrmUI.RLT.Manager; using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using static DPumpHydr.WinFrmUI.RLT.Helper.MaterialDrawHelper; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region MaterialCard public class MaterialCard : System.Windows.Forms.Panel, MaterialControlI { [Browsable(false)] public int Depth { get; set; } [Browsable(false)] public MaterialSkinManager SkinManager => MaterialSkinManager.Instance; [Browsable(false)] public MaterialMouseState MouseState { get; set; } public MaterialCard() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); Paint += new PaintEventHandler(paintControl); BackColor = SkinManager.BackgroundColor; ForeColor = SkinManager.TextHighEmphasisColor; Margin = new Padding(SkinManager.FORM_PADDING); Padding = new Padding(SkinManager.FORM_PADDING); } private void drawShadowOnParent(object sender, PaintEventArgs e) { if (Parent == null) { RemoveShadowPaintEvent((Control)sender, drawShadowOnParent); return; } // paint shadow on parent Graphics gp = e.Graphics; Rectangle rect = new(Location, ClientRectangle.Size); gp.SmoothingMode = SmoothingMode.AntiAlias; DrawSquareShadow(gp, rect); } protected override void InitLayout() { LocationChanged += (sender, e) => { Parent?.Invalidate(); }; ForeColor = SkinManager.TextHighEmphasisColor; } protected override void OnParentChanged(EventArgs e) { base.OnParentChanged(e); if (Parent != null) { AddShadowPaintEvent(Parent, drawShadowOnParent); } if (_oldParent != null) { RemoveShadowPaintEvent(_oldParent, drawShadowOnParent); } _oldParent = Parent; } private Control _oldParent; protected override void OnVisibleChanged(EventArgs e) { base.OnVisibleChanged(e); if (Parent == null) { return; } if (Visible) { AddShadowPaintEvent(Parent, drawShadowOnParent); } else { RemoveShadowPaintEvent(Parent, drawShadowOnParent); } } private bool _shadowDrawEventSubscribed = false; private void AddShadowPaintEvent(Control control, PaintEventHandler shadowPaintEvent) { if (_shadowDrawEventSubscribed) { return; } control.Paint += shadowPaintEvent; control.Invalidate(); _shadowDrawEventSubscribed = true; } private void RemoveShadowPaintEvent(Control control, PaintEventHandler shadowPaintEvent) { if (!_shadowDrawEventSubscribed) { return; } control.Paint -= shadowPaintEvent; control.Invalidate(); _shadowDrawEventSubscribed = false; } protected override void OnBackColorChanged(EventArgs e) { base.OnBackColorChanged(e); BackColor = SkinManager.BackgroundColor; } private void paintControl(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; g.Clear(Parent.BackColor == Color.Transparent ? ((Parent.Parent == null || (Parent.Parent != null && Parent.Parent.BackColor == Color.Transparent)) ? SkinManager.BackgroundColor : Parent.Parent.BackColor) : Parent.BackColor); // card rectangle path RectangleF cardRectF = new(ClientRectangle.Location, ClientRectangle.Size); cardRectF.X -= 0.5f; cardRectF.Y -= 0.5f; GraphicsPath cardPath = CreateRoundRect(cardRectF, 4); // button shadow (blend with form shadow) DrawSquareShadow(g, ClientRectangle); // Draw card using SolidBrush normalBrush = new(BackColor); g.FillPath(normalBrush, cardPath); } } #endregion }