Vista下將Area效果應用到整個窗體
最近在找其它資源時,無意間發現了一個程序可以將Area效果應用到整個窗體。感覺挺有意思,看了一下代碼還是挺簡單的。
首先需要兩個API,DwmIsCompositionEnabled和DwmExtendFrameIntoClientArea。
DwmIsCompositionEnabled是用來判斷系統是否開啟了Area效果,當為False時為沒有開啟,這時有兩種情況一個是系統不支持,另外一種是用戶手動關閉了效果。如果是用戶手動關閉的,你仍然可以使你的程序具有Area效果。否則是不可以的。
DwmExtendFrameIntoClientArea是用來使你的窗體具有Area效果,可以是整個窗體,也可以是窗體的一部分。這個函數的第一個參數是需要應用Area效果窗體的Handle,第二個參數是一個MARGINS結構可以指定在窗體的什麼部位應用Area效果,如果是全部可以設置為-1,如果取消Area效果可以設置為0。
下面看一下這兩個API的聲明。
1 [DllImport("dwmapi.dll", PreserveSig =false)]
2 staticexternvoid DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
3
4 [DllImport("dwmapi.dll", PreserveSig =false)]
5 staticexternbool DwmIsCompositionEnabled();
下面就是實現的代碼了。
設置Area效果
1 publicstaticbool Enable(Window window)
2 {
3 try
4 {
5 if (!DwmIsCompositionEnabled())
6 returnfalse;
7
8 IntPtr hwnd =new WindowInteropHelper(window).Handle;
9 if (hwnd == IntPtr.Zero)
10 thrownew InvalidOperationException("The Window must be shown before extending glass.");
11
12 // Set the background to transparent from both the WPF and Win32 perspectives
13 window.Background = System.Windows.Media.Brushes.Transparent;
14 HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
15
16 MARGINS margins =new MARGINS(-1);
17 DwmExtendFrameIntoClientArea(hwnd, ref margins);
18 returntrue;
19 }
20 catch (Exception ex)
21 {
22 // could not change glass, but continue
23 System.Diagnostics.Debug.WriteLine(ex.Message);
24 returnfalse;
25 }
26 }
取消Area效果
1 publicstaticbool Disable(Window window)
2 {
3 try
4 {
5 if (!DwmIsCompositionEnabled())
6 returnfalse;
7
8 IntPtr hwnd =new WindowInteropHelper(window).Handle;
9 if (hwnd == IntPtr.Zero)
10 thrownew InvalidOperationException("The Window must be shown before extending glass.");
11
12 // Set the background to transparent from both the WPF and Win32 perspectives
13 window.Background =new SolidColorBrush(System.Windows.SystemColors.WindowColor);
14 HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = System.Windows.SystemColors.WindowColor;
15
16 MARGINS margins =new MARGINS(0);
17 DwmExtendFrameIntoClientArea(hwnd, ref margins);
18 returntrue;
19 }
20 catch (Exception ex)
21 {
22 // could not change glass, but continue
23 System.Diagnostics.Debug.WriteLine(ex.Message);
24 returnfalse;
25 }
26 }
作者“梨園那出戲”