C# · 12月 29, 2021

c# – 模糊半透明形状的背景(如Aero玻璃)

我有一个无边框,不可调整大小的 WPF表单(WindowStyle = None,AllowTransparency = True,ResizeMode = NoResize)与半透明背景.这是一张关于如何在半记事本上运行的表格,一个半透明的红色矩形的图片.

不过,我想让背景变得模糊,就像Aero玻璃做的那样,除了没有所有花哨的窗口边框和彩色的背景条纹 – 我想自己处理.这是一个我想要的样子:

如何以最有效的方式实现这一点?

WinForms或WPF对我来说很好希望它应该使用与航空玻璃一样使用的东西(我只需要启用Aero就可以使用它),而不是像下面的屏幕区域一样捕获屏幕区域,并且模糊了这些东西.

这是我不想要的图片:

我知道这是可能的,我知道如何做到这一点,但是我不希望整个Aero玻璃窗口chrome,或边框和标题栏,或窗口具有用户设置的Aero玻璃颜色,JUST的效果模糊下面的窗口/窗体.

解决方法 如果要使用Aero模糊,那么可以使用 DwmEnableBlurBehindWindow api.这是一个使用这个的派生窗口的例子. public class BlurWindow : Window{ #region Constants private const int WM_DWMCOMPOSITIONCHANGED = 0x031E; private const int DWM_BB_ENABLE = 0x1; #endregion //Constants #region Structures [StructLayout( LayoutKind.Sequential )] private struct DWM_BLURBEHIND { public int dwFlags; public bool fEnable; public IntPtr hRgnBlur; public bool fTransitionOnMaximized; } [StructLayout( LayoutKind.Sequential )] private struct MARGINS { public int cxLeftWidth; public int cxRightWidth; public int cyTopHeight; public int cyBottomHeight; } #endregion //Structures #region APIs [DllImport( “dwmapi.dll”,PreserveSig = false )] private static extern void DwmEnableBlurBehindWindow(IntPtr hwnd,ref DWM_BLURBEHIND blurBehind); [DllImport( “dwmapi.dll” )] private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd,ref MARGINS pMargins); [DllImport( “dwmapi.dll”,PreserveSig = false )] private static extern bool DwmIsCompositionEnabled(); #endregion //APIs #region Constructor public BlurWindow() { this.WindowStyle = System.Windows.WindowStyle.None; this.ResizeMode = System.Windows.ResizeMode.NoResize; this.Background = Brushes.Transparent; } #endregion //Constructor #region Base class overrides protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized( e ); if ( Environment.OSVersion.Version.Major >= 6 ) { var hwnd = new WindowInteropHelper( this ).Handle; var hs = HwndSource.FromHwnd( hwnd ); hs.CompositionTarget.BackgroundColor = Colors.Transparent; hs.AddHook( new HwndSourceHook( this.WndProc ) ); this.InitializeGlass( hwnd ); } } #endregion //Base class overrides #region Methods #region InitializeGlass private void InitializeGlass(IntPtr hwnd) { if ( !DwmIsCompositionEnabled() ) return; // fill the background with glass var margins = new MARGINS(); margins.cxLeftWidth = margins.cxRightWidth = margins.cyBottomHeight = margins.cyTopHeight = -1; DwmExtendFrameIntoClientArea( hwnd,ref margins ); // initialize blur for the window DWM_BLURBEHIND bbh = new DWM_BLURBEHIND(); bbh.fEnable = true; bbh.dwFlags = DWM_BB_ENABLE; DwmEnableBlurBehindWindow( hwnd,ref bbh ); } #endregion //InitializeGlass #region WndProc private IntPtr WndProc(IntPtr hwnd,int msg,IntPtr wParam,IntPtr lParam,ref bool handled) { if ( msg == WM_DWMCOMPOSITIONCHANGED ) { this.InitializeGlass( hwnd ); handled = false; } return IntPtr.Zero; } #endregion //WndProc #endregion //Methods}

这是一个使用BlurWindow的片段.

var w = new BlurWindow();w.Width = 100;w.Height = 100;w.MouseLeftButtonDown += (s1,e1) => { ((Window)s1).DragMove(); e1.Handled = true;};w.Background = new SolidColorBrush( Color.FromArgb( 75,255,0 ) );w.Show();