自定义Winform窗体,加阴影效果

mac2025-01-27  23

1.win32 api 

public class BoxShadow { public const int CS_DROPSHADOW = 0x00020000;//可用背影框 public const int WM_NCPAINT = 0x0085;//绘制 public const int WM_NCHITTEST = 0x84;// 可以拖拽窗体 public const int HTCLIENT = 0x1;//窗体 public const int HTCAPTION = 0x2;//窗体标题栏 [DllImport("dwmapi.dll")] public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); /// <summary> /// 设置窗体属性 /// </summary> /// <param name="hwnd"></param> /// <param name="attr"></param> /// <param name="attrValue"></param> /// <param name="attrSize"></param> /// <returns></returns> [DllImport("dwmapi.dll")] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); /// <summary> /// 复合窗体是否可用 /// </summary> /// <param name="pfEnabled"></param> /// <returns></returns> [DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(ref int pfEnabled); public struct MARGINS // 背影框 struct { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } }

2.自定义窗体

//是否启用Aero private bool _mAeroEnabled; public virtual bool UserBoxShadow { get; set; } protected override CreateParams CreateParams { get { if (UserBoxShadow) { _mAeroEnabled = CheckAeroEnabled(); var cp = base.CreateParams; if (!_mAeroEnabled) cp.ClassStyle |= BoxShadow.CS_DROPSHADOW; return cp; } return base.CreateParams; } } protected override void WndProc(ref Message m) { if (UserBoxShadow) { switch (m.Msg) { case BoxShadow.WM_NCPAINT: // box shadow if (_mAeroEnabled) { var v = 2; BoxShadow.DwmSetWindowAttribute(Handle, 2, ref v, 4); var margins = new BoxShadow.MARGINS { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; BoxShadow.DwmExtendFrameIntoClientArea(Handle, ref margins); } break; } } base.WndProc(ref m); } private bool CheckAeroEnabled() { if (Environment.OSVersion.Version.Major >= 6) { int enabled = 0; BoxShadow.DwmIsCompositionEnabled(ref enabled); return enabled == 1; } return false; }

 

最新回复(0)