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

前端之家收集整理的这篇文章主要介绍了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();

猜你在找的C#相关文章