zoukankan      html  css  js  c++  java
  • 一起谈.NET技术,WPF 扩展玻璃效果(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

  • 相关阅读:
    [Yii Framework] 在views里面如何调用本controller的方法,获取一定的值
    [Yii Framework] 如何调用extension扩展
    [Yii Framework] 当AR类于数据库中的表的名字不同时
    [Yii Framework] 创建helper的注意事项
    [Yii Framework] Parameterized Named Scopes(命名规范参数化)
    [Yii Framework] 验证方法
    [Yii Framework] 删除AR后注意事项
    [Yii Framework] 如何使用theme
    [Yii Framework] 创建自己的extension
    彻底解决刷新重复提交问题,你还在用Response.Redirect吗?
  • 原文地址:https://www.cnblogs.com/waw/p/2162794.html
Copyright © 2011-2022 走看看