WPF中将Vista Aero效果扩展到整个窗口

效果图:


有不少示例介绍了如何将Vista Aero效果扩展到整个窗口,但大都是针对Windows Form应用程序,而不是WPF(即前者针对的是Form类,后者是针对的Window类),比如http://www.cnblogs.com/zhouyinhui/archive/2007/05/30/765416.html

其实与其类似,都是调用dwmapi,只不过Window类没有直接给我们提供句柄,我们需要这样的代码来找到其句柄:

IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;

然后将窗口的背景设置为透明:

window.Background = Brushes.Transparent;

HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;最后调用

DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);

注意,我们应该在窗口被显示之后(SourceInitialized之后)再调用我们的函数否则会引发异常。

参考代码:

public partial class Window1 : System.Windows.Window
  {

    public Window1()
    {
      InitializeComponent();

    }

    protected override void OnSourceInitialized(EventArgs e)
    {
      base.OnSourceInitialized(e);
      DWMLib.AeroHelper.ExtendGlassFrame(this, new Thickness(-1));

    }

  }

public class AeroHelper

{
    public static bool ExtendGlassFrame(Window window, Thickness margin)
    {
      if (!DwmApi.DwmIsCompositionEnabled())
        return false;

      IntPtr hwnd = new WindowInteropHelper(window).Handle;
      if (hwnd == IntPtr.Zero)
        throw new InvalidOperationException("The Window must be shown before extending glass.");

      // Set the background to transparent from both the WPF and Win32 perspectives
      window.Background = Brushes.Transparent;
      HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;

      DWMLib.DwmApi.MARGINS margins = new DWMLib.DwmApi.MARGINS((int)margin.Left, (int)margin.Top, (int)margin.Right, (int)margin.Bottom);
      DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);

      return true;
    }

public class DwmApi

{
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmEnableBlurBehindWindow(IntPtr hWnd, DWM_BLURBEHIND pBlurBehind);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, MARGINS pMargins);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmGetColorizationColor(
      out int pcrColorization,
      [MarshalAs(UnmanagedType.Bool)]out bool pfOpaqueBlend);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmEnableComposition(bool bEnable);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern IntPtr DwmRegisterThumbnail(IntPtr dest, IntPtr source);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmUnregisterThumbnail(IntPtr hThumbnail);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmUpdateThumbnailProperties(IntPtr hThumbnail, DWM_THUMBNAIL_PROPERTIES props);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmQueryThumbnailSourceSize(IntPtr hThumbnail, out Size size);

    [StructLayout(LayoutKind.Sequential)]
    public class DWM_THUMBNAIL_PROPERTIES
    {
      public uint dwFlags;
      public RECT rcDestination;
      public RECT rcSource;
      public byte opacity;
      [MarshalAs(UnmanagedType.Bool)]
      public bool fVisible;
      [MarshalAs(UnmanagedType.Bool)]
      public bool fSourceClientAreaOnly;

      public const uint DWM_TNP_RECTDESTINATION = 0x00000001;
      public const uint DWM_TNP_RECTSOURCE = 0x00000002;
      public const uint DWM_TNP_OPACITY = 0x00000004;
      public const uint DWM_TNP_VISIBLE = 0x00000008;
      public const uint DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;
    }

    [StructLayout(LayoutKind.Sequential)]
    public class MARGINS
    {
      public int cxLeftWidth, cxRightWidth, cyTopHeight, cyBottomHeight;

      public MARGINS(int left, int top, int right, int bottom)
      {
        cxLeftWidth = left;
        cyTopHeight = top;
        cxRightWidth = right;
        cyBottomHeight = bottom;
      }
    }

    [StructLayout(LayoutKind.Sequential)]
    public class DWM_BLURBEHIND
    {
      public uint dwFlags;
      [MarshalAs(UnmanagedType.Bool)]
      public bool fEnable;
      public IntPtr hRegionBlur;
      [MarshalAs(UnmanagedType.Bool)]
      public bool fTransitionOnMaximized;

      public const uint DWM_BB_ENABLE = 0x00000001;
      public const uint DWM_BB_BLURREGION = 0x00000002;
      public const uint DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
      public int left, top, right, bottom;

      public RECT(int left, int top, int right, int bottom)
      {
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
      }
    }
  }

时间: 2024-11-08 19:03:21

WPF中将Vista Aero效果扩展到整个窗口的相关文章

win7系统个性化设置和Windows Aero效果教程

Windows Aero效果要求与功能: 从Windows Vista系统开始,微软在系统中引入Aero功能,只要电脑的显卡内存在125M以上,并支持DirectX 9或以上版本,就可以打开该功能.打开Aero功能后,Windows窗口呈现透明化,将鼠标悬停在任务栏的图标上,还可以预览对应的窗口. 电脑公司win7系统如何设置Windows Aero效果操作步骤: 1.在桌面空白处单击右键,选择"个性化"选项.如图1所示   Win7系统选择"个性化"选项    

如何调整windows7 aero效果

Win7的aero毛玻璃窗口简洁大方,但对于不时喜欢变下win7主题的朋友来讲,在控制面板中仅能在"个性化/窗口颜色和外观"有限的几个色彩风格中选择,实在贫乏. 这里向大家介绍一款名为"aerotuner"的小工具,它可以轻松定义win7 aero效果的颜色和外观,让最挑剔的人都能找到自己满意的aero效果. 运行aerotuner后点击"color色彩",下"main color主窗口色彩"和"glow color

怎么样给win7提速还是保持它的Aero效果

win7界面的好看和它个个方面的人性化功能,都是来源于它的Aero特效.如果你想了解那些方面是win7的Aero特效,那么你可以看下<什么是win7 Aero特效 >. 1 如果你的电脑非常卡,或者你不喜欢这个特效,那么你也可以关闭它. 想要关闭它的请看<配置太烂了换win7系统要不要关掉Aero特效呢? >而这篇文章要用的是win7一个功能而已,下面跟大家说下怎么开启. 2 点击开始,在搜索栏里面输入轻松,然后点击并进入轻松访问中心. 在打开的轻松访问中心里面,点击"使

win8怎么开启aero效果?

  win8开启aero效果教程来咯~有很多朋友问win8怎么开启aero效果,虽然微软已经全部Windows8系统去除了Aero效果,但我们还是有方法的哦~有需要的朋友就请参考下文吧. 第一步.桌面上右键打开"个性化"设置窗口,在主题列表中选择"高对比度主题"--"高对比度#1". 第二步.等Win8应用这个高对比度主题后,系统会变成如下图中的外观,点击下方的"颜色",进入"颜色和外观"窗口.注意,进入后

c#+wpf,这种排版效果要用怎样的控件和布局容器才能做出来?有集成的技术?

问题描述 c#+wpf,这种排版效果要用怎样的控件和布局容器才能做出来?有集成的技术? 如图所示,黑框里的小黑框指向是一个文件,小黑框会动态增加(根据存储文件地址的集合存储了多少个文件就增加多少个小黑框),然后得加滚动条.用c#+wpf怎么做出这种布局排版效果,需要用到什么布局容器和控件或其他技术了?这种排版效果有集成的么?不求提供具体代码,只求提供需要用到什么布局容器以及控件或其他技术的信息.有提供集成的或具体的方案或提供具体的代码更好.我会感激不尽,我会以其他方式回报解决我问题的人. 另外我

WPF中将16进制颜色码转换成SolidColorBrush

原文:WPF中将16进制颜色码转换成SolidColorBrush 使用ColorConverter.ConvertFromString(string colorValue)方法 例如:new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFD3CFC7"));

wpf 动画实现以下效果

问题描述 wpf 动画实现以下效果 想要实现上面链接的动画效果,有大神实现过吗? 解决方案 WPF实现射线效果动画WPF实现淡入淡出效果

WPF绘制党徽(立体效果,Cool)

原文:WPF绘制党徽(立体效果,Cool) 前面用WPF方式绘制了党旗(WPF制作的党旗) ,去年3月份利用C# 及GDI+绘制过党徽,这次使用WPF来绘制党徽. --------------------------------------------------------------------------------引用或转载时请保留以下信息:大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.co

微软将结束对Windows Vista系统的扩展支持

4月11日,微软将结束对于Windows Vista系统的扩展支持,彻底停止发放安全更新和修复.这款备受争议.被很多人视为微软最失败的操作系统将就此成为历史.Windows Vista正式发布于2007年1月30日,此时距离上一版本Windows XP的发布已经过去超过五年,这也是Windows历史上发布间隔时间最长的一次. Vista被微软寄予厚望,从里到外都焕然一新,但也正是因为过于激进,很多地方还不够成熟,尤其是硬件配合没有到位,导致实际体验并不尽如人意,评价很差. 但这并不能否认Vist