我正在使用以下代码为我的WinForms创建Windows7风格的下拉阴影效果:
上面代码的结果在我的无边框 winform 上创建了一个漂亮的阴影效果,但它会导致 UI 失真。我的窗体上所有的控件和标签都显示不正常,文本不可读。
我错过了什么吗?我不想使用传统的 CreateParams 方式创建阴影效果,因为它看起来太“盒状”了,不能产生好的阴影效果。
下面是没有阴影和有阴影的截图: 谢谢。
<DllImport("dwmapi.dll", PreserveSig:=True)> _
Private Shared Function DwmSetWindowAttribute(hwnd As IntPtr, attr As Integer, ByRef attrValue As Integer, attrSize As Integer) As Integer
End Function
<DllImport("dwmapi.dll")> _
Private Shared Function DwmExtendFrameIntoClientArea(hWnd As IntPtr, ByRef pMarInset As Margins) As Integer
End Function
Private Function CreateDropShadow() As Boolean
Try
Dim val As Integer = 2
Dim ret1 As Integer = DwmSetWindowAttribute(Me.Handle, 2, val, 4)
If ret1 = 0 Then
Dim m As New Margins(0, 0, 0, 0)
Dim ret2 As Integer = DwmExtendFrameIntoClientArea(Me.Handle, m)
Return ret2 = 0
Else
Return False
End If
Catch ex As Exception
' Probably dwmapi.dll not found (incompatible OS)
Return False
End Try
End Function
Protected Overrides Sub OnHandleCreated(e As EventArgs)
CreateDropShadow()
MyBase.OnHandleCreated(e)
End Sub
上面代码的结果在我的无边框 winform 上创建了一个漂亮的阴影效果,但它会导致 UI 失真。我的窗体上所有的控件和标签都显示不正常,文本不可读。
我错过了什么吗?我不想使用传统的 CreateParams 方式创建阴影效果,因为它看起来太“盒状”了,不能产生好的阴影效果。
下面是没有阴影和有阴影的截图: 谢谢。
DwmExtendFrameIntoClientArea
函数并将所有边缘的间距都设置为0,结果是我没有获得任何投影效果(Windows 7 SP1,x86)。然而,如果我为每个边缘调用它时使用间距1,则可以获得所需的aero投影。唯一剩下要做的就是用窗体的背景颜色覆盖已创建的框架区域。否则,我没有注意到任何奇怪的行为。 - Andreas AdlerFormBorderStyle
属性设置为None
,那么是的,我确定。 - Andreas Adler