// 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 LayeredFormMask : ILayeredFormOpacity { int Radius = 0, Bor = 0; bool HasBor = false; Form form; public LayeredFormMask(Form _form) { form = _form; TopMost = _form.TopMost; if (form.WindowState != FormWindowState.Maximized) { if (form is BorderlessForm borderless) Radius = (int)(borderless.Radius * Config.Dpi); else if (OS.Win11) Radius = (int)(8 * Config.Dpi); //Win11 if (form is Window || form is FormNoBar) { //无边框处理 } else if (form.FormBorderStyle != FormBorderStyle.None) { HasBor = true; Bor = (int)(7 * Config.Dpi); } } if (form is Window window) { SetSize(window.Size); SetLocation(window.Location); Size = window.Size; Location = window.Location; } else { SetSize(form.Size); SetLocation(form.Location); Size = form.Size; Location = form.Location; } } protected override void OnLoad(EventArgs e) { if (form is Window window) { SetSize(window.Size); SetLocation(window.Location); Size = window.Size; Location = window.Location; } else { SetSize(form.Size); SetLocation(form.Location); Size = form.Size; Location = form.Location; } form.LocationChanged += Form_LSChanged; form.SizeChanged += Form_LSChanged; base.OnLoad(e); } private void Form_LSChanged(object? sender, EventArgs e) { if (form is Window window) { SetSize(window.Size); SetLocation(window.Location); Size = window.Size; Location = window.Location; } else { SetSize(form.Size); SetLocation(form.Location); Size = form.Size; Location = form.Location; } temp?.Dispose(); temp = null; Print(); } protected override void Dispose(bool disposing) { form.LocationChanged -= Form_LSChanged; form.SizeChanged -= Form_LSChanged; temp?.Dispose(); temp = null; base.Dispose(disposing); } Bitmap? temp = null; public override Bitmap PrintBit() { Rectangle rect; if (HasBor) rect = new Rectangle(Bor, 0, TargetRect.Width - Bor * 2, TargetRect.Height - Bor); else rect = TargetRectXY; if (temp == null || (temp.Width != TargetRect.Width || temp.Height != TargetRect.Height)) { temp?.Dispose(); temp = new Bitmap(TargetRect.Width, TargetRect.Height); using (var g = Graphics.FromImage(temp).High()) { using (var brush = new SolidBrush(Color.FromArgb(115, 0, 0, 0))) { if (Radius > 0) { using (var path = rect.RoundPath(Radius)) { g.FillPath(brush, path); } } else g.FillRectangle(brush, rect); } } } return (Bitmap)temp.Clone(); } } public interface FormNoBar { } }