// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED. // THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License. // LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License") // YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License. // YOU MAY OBTAIN A COPY OF THE LICENSE AT // // http://www.apache.org/licenses/LICENSE-2.0 // // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE // DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND // LIMITATIONS UNDER THE License. // GITEE: https://gitee.com/antdui/AntdUI // GITHUB: https://github.com/AntdUI/AntdUI // CSDN: https://blog.csdn.net/v_132 // QQ: 17379620 using System; using System.Drawing; using System.Windows.Forms; namespace AntdUI { internal class BorderlessFormShadow : Form { BorderlessForm form; //带参构造 public BorderlessFormShadow(BorderlessForm main) { form = main; SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true); UpdateStyles(); //置顶窗体 //TopMost = BorderlessForm.TopMost; //BorderlessForm.BringToFront(); ShowInTaskbar = false; FormBorderStyle = FormBorderStyle.None; Icon = form.Icon; ShowIcon = false; Text = form.Text; ISize(); } #region 无焦点窗体 protected override CreateParams CreateParams { get { var cp = base.CreateParams; cp.ExStyle |= 0x08000000 | 0x00080000; if (form != null && form.ShadowPierce) cp.ExStyle |= 0x20; cp.Parent = IntPtr.Zero; return cp; } } protected override bool ShowWithoutActivation { get => true; } protected override void WndProc(ref System.Windows.Forms.Message m) { if (form.Resizable) { switch (m.Msg) { case 0x21: m.Result = new IntPtr(3); return; case 0xa0: case 0x200: if (form.ResizableMouseMove(PointToClient(MousePosition))) return; break; case 0xa1: case 0x201: if (form.ResizableMouseDown()) return; break; } } base.WndProc(ref m); } #endregion #region 初始化 public void ClearShadow() { bitbmp?.Dispose(); bitbmp = null; } public void OnSizeChange() { if (form.IsMax) Visible = false; else { if (form.Visible) Visible = true; ISize(); Print(); } } public void OnLocationChange() { ISize(); Print(); } Rectangle shadow_rect = new Rectangle(0, 0, 0, 0), rect_read; protected override void OnCreateControl() { base.OnCreateControl(); ISize(); Print(); } #endregion #region 控件层相关事件 public void ISize() { int shadow = (int)(form.Shadow * Config.Dpi), shadow2 = shadow * 2; rect_read = new Rectangle(shadow, shadow, form.Width, form.Height); shadow_rect = new Rectangle(form.Left - shadow, form.Top - shadow, rect_read.Width + shadow2, rect_read.Height + shadow2); } #endregion #region 渲染 public void Print() { if (IsHandleCreated && shadow_rect.Width > 0 && shadow_rect.Height > 0) { if (InvokeRequired) { Invoke(new Action(Print)); return; } try { using (var bmp = PrintBit()) { if (bmp == null) return; Win32.SetBits(bmp, shadow_rect, Handle, 255); } GC.Collect(); } catch { } } } Bitmap? bitbmp = null; Bitmap PrintBit() { int radius = (int)(form.Radius * Config.Dpi), shadow = (int)(form.Shadow * Config.Dpi), shadow2 = shadow * 2, shadow4 = shadow * 4, shadow6 = shadow * 6; if (bitbmp == null) { bitbmp = new Bitmap(shadow6, shadow6); using (var g = Graphics.FromImage(bitbmp).High()) { using (var path = new Rectangle(shadow, shadow, shadow6 - shadow2, shadow6 - shadow2).RoundPath(radius)) { using (var brush = new SolidBrush(form.ShadowColor)) { g.FillPath(brush, path); } Helper.Blur(bitbmp, shadow); } } } var bitmap = new Bitmap(shadow_rect.Width, shadow_rect.Height); using (var g = Graphics.FromImage(bitmap).High()) { using (var path = rect_read.RoundPath(radius)) { using (var path2 = new System.Drawing.Drawing2D.GraphicsPath()) { path2.AddPath(path, false); path2.AddRectangle(new Rectangle(0, 0, shadow_rect.Width, shadow_rect.Height)); g.SetClip(path2); } int r = shadow2 + radius; g.DrawImage(bitbmp, new Rectangle(0, 0, shadow2, shadow2), new Rectangle(0, 0, shadow2, shadow2), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(0, shadow2, shadow, bitmap.Height - shadow4), new Rectangle(0, shadow2, shadow, bitbmp.Height - shadow4), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(0, bitmap.Height - shadow2, shadow2, shadow2), new Rectangle(0, bitbmp.Height - shadow2, shadow2, shadow2), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(shadow2, bitmap.Height - shadow, bitmap.Width - shadow4, shadow), new Rectangle(shadow2, bitbmp.Height - shadow, bitbmp.Width - shadow4, shadow), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(bitmap.Width - shadow2, bitmap.Height - shadow2, shadow2, shadow2), new Rectangle(bitbmp.Width - shadow2, bitbmp.Height - shadow2, shadow2, shadow2), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(bitmap.Width - shadow, shadow2, shadow, bitmap.Height - shadow4), new Rectangle(bitbmp.Width - shadow, shadow2, shadow, bitbmp.Height - shadow4), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(bitmap.Width - shadow2, 0, shadow2, shadow2), new Rectangle(bitbmp.Width - shadow2, 0, shadow2, shadow2), GraphicsUnit.Pixel); g.DrawImage(bitbmp, new Rectangle(shadow2, 0, bitmap.Width - shadow4, shadow), new Rectangle(shadow2, 0, bitbmp.Width - shadow4, shadow), GraphicsUnit.Pixel); g.ResetClip(); if (form.BorderWidth > 0) { using (var pen = new Pen(form.BorderColor, form.BorderWidth * Config.Dpi)) { g.DrawPath(pen, path); } } } } return bitmap; } #endregion } }