一起谈.NET技术,WPF 扩展玻璃效果(Aero Glass)
2011-09-01 23:47
483 查看
Windows 7 操作系统默认具有一款玻璃效果主题(Aero Glass)。如果选择了该款主题,所有的应用程序标题栏都会处于玻璃透明效果(如下图)。这个功能是由Desktop Window Manager(DWM)服务支持的。
默认情况下,我们编写的应用程序在Windows 7 中也只有标题栏和窗口框架会具备玻璃效果,其他区域仍是不透明状态(如下图)。如果想将程序整体都改为上图IE 窗口的效果,可以使用DWM API 将玻璃区域进行扩展。
首先,从dwmapi.dll 中调取DwmExtendFrameIntoClientArea 方法。
创建方法ExtendAeroGlass 方法,可将WPF Window窗口的Aero Glass 区域扩展。
简单制作一个WPF 界面。
补充CheckBox 点击事件,在其中启用ExtendAeroGlass 方法。
点击"Extend AeroGlass" 选框,界面中<Grid> 也将呈现玻璃效果。
默认情况下,我们编写的应用程序在Windows 7 中也只有标题栏和窗口框架会具备玻璃效果,其他区域仍是不透明状态(如下图)。如果想将程序整体都改为上图IE 窗口的效果,可以使用DWM API 将玻璃区域进行扩展。
首先,从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; } }
演示效果
运行程序后,默认界面状态。点击"Extend AeroGlass" 选框,界面中<Grid> 也将呈现玻璃效果。
Windows API
通过Windows API Code Pack 可以对Aero Glass 效果进行开启或关闭。在程序中加入Microsoft.WindowsAPICodePack.Shell 命名空间,调整AeroGlassCompositioinEnabled 完成开/关Aero Glass的效果。GlassWindow.AeroGlassCompositionEnabled = checkBox.IsChecked.Value;
源代码:WpfAeroGlass.zip
相关文章推荐
- 一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展
- 一起谈.NET技术,技巧:使用可扩展对象模式扩展HttpApplication
- 一起谈.NET技术,ASP.NET MVC验证框架中关于属性标记的通用扩展方法
- 一起谈.NET技术,Silverlight 游戏开发小技巧:轨迹跟随效果
- 一起谈.NET技术,WPF与混淆器
- 一起谈.NET技术,详解Visual Studio 2010中的扩展管理器
- 一起谈.NET技术,ASP.NET 4.0 一些隐性的扩展
- 一起谈.NET技术,.NET4.0的可扩展缓存系统
- 一起谈.NET技术,WPF Ribbon 开发资料分享
- 一起谈.NET技术,WPF/Silverlight深度解决方案:目录
- WPF 几行代码实现窗体毛玻璃效果(Aero Glass)
- 一起谈.NET技术,由扩展方法引申出的编程思维
- 一起谈.NET技术,Silverlight 游戏开发小技巧:星球大战字幕效果
- 一起谈.NET技术,从扩展方法到流畅的程序体验(一)
- 一起谈.NET技术,.NET 4的新特性:图表、SEO及可扩展的输出缓存
- 一起谈.NET技术,利用WPF建立自适应窗口大小布局的WinForm窗口
- 一起谈.NET技术,WPF 企业内训全程实录(中)
- 一起谈.NET技术,基于CallContextInitializer的WCF扩展导致的严重问题
- Windows 7 扩展玻璃效果(Aero Glass)
- 一起谈.NET技术,WPF Multi-Touch 开发:惯性效果(Inertia)