WPF技巧大全:[2]Aero Glass 效果
1、打开VS,新建“WPF应用程序”项目,VB.NET/C#均可,VS12起C++也可以。
(本例用的是VB.NET,马上就会更新C#版)
![WPF技巧大全:[2]Aero Glass 效果](https://exp-picture.cdn.bcebos.com/4a594f2c8cf1d8a78288633046e34b2c57ee4713.jpg)
2、 创建一个类AeroGlassHelper,用于协助将Aero Glass扩展到窗口中。
3、添加以下API声明,其中Margins是一个辅助结构,待会会定义。
![WPF技巧大全:[2]Aero Glass 效果](https://exp-picture.cdn.bcebos.com/7a3e980e7c75e5f4514ec5b9b1ceaad7736bbc13.jpg)
4、创建扩展Aero Glass的函数
![WPF技巧大全:[2]Aero Glass 效果](https://exp-picture.cdn.bcebos.com/0da37be7340f6478a298950dfd3e21c2bad6b513.jpg)
5、创建辅助结构,至此用来扩展的对象已经写完。
![WPF技巧大全:[2]Aero Glass 效果](https://exp-picture.cdn.bcebos.com/ba97ffd06de89a61389e6a2745e8b004551bad13.jpg)
6、下面创建一个继承自Window的类ExtendAeroGlassWindow,
分别写初始化过程、创建WinProc消息处理函数(WPF没有该函数)以及获取或设置窗口各边要扩展Aero Glass的宽度的属性。
Public Class ExtendAeroGlassWindow
Inherits System.Windows.Window
Private Const WM_DWMCOMPOSITIONCHANGED As Integer = &H31E
Protected Overrides Sub OnSourceInitialized(e As EventArgs)
MyBase.OnSourceInitialized(e)
Try
AeroGlassHelper.ExtendGlassFrame(Me, ExtendGlassFrameWidth)
Dim h As New WindowInteropHelper(Me)
Dim hwnd = h.Handle
HwndSource.FromHwnd(hwnd).AddHook(New HwndSourceHook(AddressOf WndProc))
Catch ex As Exception
End Try
End Sub
Private Function WndProc(hwnd As IntPtr, msg As Integer, wParam As IntPtr,
lParam As IntPtr, ByRef handled As Boolean) As IntPtr
If msg = WM_DWMCOMPOSITIONCHANGED Then
Try
AeroGlassHelper.ExtendGlassFrame(Me, ExtendGlassFrameWidth)
handled = True
Catch ex As Exception
End Try
End If
Return IntPtr.Zero
End Function
Protected Friend _ExtendGlassFrameWidth As Thickness = New Thickness(-1)
''' <summary>
''' 获取或设置窗口各边要扩展Aero Glass的宽度。
''' </summary>
''' <value></value>
''' <returns>
''' 一个Thickness对象,描述窗体周围框架的粗细。
''' </returns>
''' <remarks></remarks>
Public Property ExtendGlassFrameWidth() As Thickness
Get
Return _ExtendGlassFrameWidth
End Get
Set(value As Thickness)
Try
AeroGlassHelper.ExtendGlassFrame(Me, value)
Catch ex As Exception
Exit Property
End Try
_ExtendGlassFrameWidth = value
End Set
End Property
End Class
7、大功告成!以后XAML定义的窗体就从ExtendAeroGlassWindow而不是Window创建。