WPF 扩展玻璃效果(Aero Glass)

2010-10-05 05:13

WPF 扩展玻璃效果(Aero Glass)

by Gnie

at 2010-10-04 21:13:00

original http://www.cnblogs.com/gnielee/archive/2010/10/04/wpf-extend-aero-glass.html


作者: Gnie 发表于 2010-10-04 21:13 原文链接 阅读: 1505 评论: 18

     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

评论: 18 查看评论 发表评论

程序员找工作,就在博客园


最新新闻:
· ZFS文件系统提供数据加密功能(2010-10-06 13:26)
· 传必应将取代谷歌成为火狐浏览器默认搜索(2010-10-06 13:24)
· Android过去6个月成美国智能手机买主首选平台(2010-10-06 13:22)
· Foursquare解释昨天11小时宕机事件:数据库Shards过载(2010-10-06 13:16)
· AOL也山寨团购网站(2010-10-06 13:11)

编辑推荐:2010年10月编程语言排行榜:Java的混乱之治

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库