zoukankan      html  css  js  c++  java
  • Windows 7 扩展玻璃效果(Aero Glass)

    Windows 7 操作系统默认具有一款玻璃效果主题(Aero Glass)。如果选择了该款主题,所有的应用程序标题栏都会处于玻璃透明效果(如下图)。这个功能是由Desktop Window Manager(DWM)服务支持的。

    GlassExample

    默认情况下,我们编写的应用程序在Windows 7 中也只有标题栏和窗口框架会具备玻璃效果,其他区域仍是不透明状态(如下图)。如果想将程序整体都改为上图IE 窗口的效果,可以使用DWM API 将玻璃区域进行扩展。

    Notepad

    首先,从dwmapi.dll 中调取DwmExtendFrameIntoClientArea 方法。

    [StructLayout(LayoutKind.Sequential)]
    public struct MARGINS
    {
        public int cxLeftWidth;      
        public int cxRightWidth;     
        public int cyTopHeight;      
        public int cyBottomHeight;   
    };
    
    [DllImport("DwmApi.dll")]
    public static extern int DwmExtendFrameIntoClientArea(
        IntPtr hwnd,
        ref MARGINS pMarInset);

    创建方法ExtendAeroGlass 方法,可将WPF Window窗口的Aero Glass 区域扩展。

    private void ExtendAeroGlass(Window window)
    {
        try
        {
            // 为WPF程序获取窗口句柄
             IntPtr mainWindowPtr = new WindowInteropHelper(window).Handle;
            HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
            mainWindowSrc.CompositionTarget.BackgroundColor = Colors.Transparent;
    
            // 设置Margins
            MARGINS margins = new MARGINS();
    
            // 扩展Aero Glass
            margins.cxLeftWidth = -1;
            margins.cxRightWidth = -1;
            margins.cyTopHeight = -1;
            margins.cyBottomHeight = -1;
    
            int hr = DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins);
            if (hr < 0)
            {
                MessageBox.Show("DwmExtendFrameIntoClientArea Failed");
            }
        }
        catch (DllNotFoundException)
        {
            Application.Current.MainWindow.Background = Brushes.White;
        }
    }

    简单制作一个WPF 界面。

    <Window x:Class="WpfAeroGlass.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid x:Name="layout">
            <Button x:Name="btn" Content="Button" Margin="191,66,202,211" />
            <CheckBox x:Name="checkBox" Content="Extend AeroGlass"
                      Click="CheckBox_Checked" Height="24" Width="121" />
        </Grid>
    </Window>
    

    补充CheckBox 点击事件,在其中启用ExtendAeroGlass 方法。

    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        if (checkBox.IsChecked.Value)
        {
            this.Background = Brushes.Transparent;
            ExtendAeroGlass(this);
        }
        else
        {
            this.Background = Brushes.White;
        }
    }

    演示效果

    运行程序后,默认界面状态。

    Default

    点击"Extend AeroGlass" 选框,界面中<Grid> 也将呈现玻璃效果。

    AllGlass

    Windows API

    通过Windows API Code Pack 可以对Aero Glass 效果进行开启或关闭。在程序中加入Microsoft.WindowsAPICodePack.Shell 命名空间,调整AeroGlassCompositioinEnabled 完成开/关Aero Glass的效果。

    GlassWindow.AeroGlassCompositionEnabled = checkBox.IsChecked.Value;

    源代码

    WpfAeroGlass.zip

  • 相关阅读:
    Java 将File转换为MultipartFile类型
    JAVA中实现根据文件路径下载文件
    Java中类似单元格之间的计算公式解析,如A1+B3-B4
    Java JPA通过hql语句查询数据
    mysql与oracle 表字段定义比较
    Java时间日期DateUtil
    fetch缓存问题
    Vue中watch的简单应用
    关于跨域和如何解决跨域问题的小结
    Google play 一直等待下载?解决方案如此简单!
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2153526.html
Copyright © 2011-2022 走看看