大佬教程收集整理的这篇文章主要介绍了删除最大化WPF自定义窗口的DropShadow,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
private static bool DropShadow(Window window) { try { WindowInteropHelper Helper = new WindowInteropHelper(window); int val = 2; int ret1 = DwmSetWindowAttribute(Helper.Handle,2,ref val,4); if (ret1 == 0) { Margins m = new Margins { Bottom = 0,Left = 0,Right = 0,Top = 0 }; int ret2 = DwmExtendFrameIntoClientArea(Helper.Handle,ref m); return ret2 == 0; } else { return false; } } catch (Exception eX) { // Probably dwmapi.dll not found (incompatible OS) return false; } }
有关详细信息,请参阅:DropShadow for WPF Borderless Window
使用WindowState.Normal时,此解决方案正常工作!但是,当我最大化应用程序并禁用DWMWA_NCRENDERING_POLICY时,窗口的背景变得稍微透明,并且我的大多数控件渲染完全不同于我以前的.
在下图中,您可以看到最初的最大化状态,以及阴影代码.正如您所看到的,它完全改变了窗口的透明度和阴影代码:o
有什么我想念的吗?我一直在阅读DWM Function library,但找不到答案……
public class GlassWindow : Window { [SuppressUnmanagedCodeSecurity] internal static class DwmNativeMethods { [StructLayout(LayoutKind.Sequential)] internal struct DwmMargins { public int cxLeftWidth; public int cxRightWidth; public int cyTopHeight; public int cyBottomHeight; public DwmMargins(bool fullWindow) { this.cxLeftWidth = this.cxRightWidth = this.cyTopHeight = this.cyBottomHeight = fullWindow ? -1 : 0; } } [DllImport("DwmApi.dll")] internal static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd,ref DwmMargins m); [DllImport("DwmApi.dll")] internal static extern int DwmSetWindowAttribute(IntPtr hwnd,int attr,ref int attrValue,int attrSizE); } privatE intPtr windowHandle; protected override void OnsourceInitialized(EventArgs E) { base.onsourceInitialized(E); WindowInteropHelper interopHelper = new WindowInteropHelper(this); this.windowHandle = interopHelper.Handle; this.ToggleAreoGlass(this.WindowState != WindowState.Maximized); this.StateChanged += this.GlassWindowStateChanged; } private void ToggleAreoGlass(bool value) { // Enable NcRenderingPolicy int attrValue = 2; int result = DwmNativeMethods.DwmSetWindowAttribute(this.windowHandle,ref attrValue,4); if (result == 0) { // Extend DwmFrame DwmNativeMethods.DwmMargins margins = new DwmNativeMethods.DwmMargins(value); DwmNativeMethods.DwmExtendFrameIntoClientArea(this.windowHandle,ref margins); } } private void GlassWindowStateChanged(object sender,EventArgs E) { this.ToggleAreoGlass(this.WindowState != WindowState.Maximized); } }
以上是大佬教程为你收集整理的删除最大化WPF自定义窗口的DropShadow全部内容,希望文章能够帮你解决删除最大化WPF自定义窗口的DropShadow所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。