首页 > Windows开发 > 详细

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

时间:2019-04-04 00:19:39      阅读:161      评论:0      收藏:0      [点我收藏+]
原文:WPF中,如何将Vista Aero效果扩展到整个窗口

                                                 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(
thisnew 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;
技术分享图片            }

技术分享图片        }

技术分享图片    }

Demo, 要正确运行Demo,你应该使用开启Aero效果的Vista版本

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

原文:https://www.cnblogs.com/lonelyxmas/p/10652528.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!