我正在使用以下代码在我的WinForms上创建Windows7样式阴影效果:
<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使用传统的投影效果,它看起来过于“四四方方”并且不会产生很好的阴影效果。
以下是没有阴影和阴影的屏幕截图:
感谢。
答案 0 :(得分:4)
Dim m As New Margins(0, 0, 0, 0)
这里有一个微妙的错误,看起来很像你正在使用System.Drawing.Printing.Margins。但那是不一种与Windows'MARGINS类型兼容的类型。哪个是结构,而不是类。
所以这完全错了,Windows读取废话而不是(0,0,0,0)。并将框架扩展到整个客户区。然后它会对使用GDI绘制的任何控件造成严重破坏,它是一个24bpp的绘图api,将alpha保留为0,所以任何应该是黑色的东西都会变得透明。
通过声明一个合适的MARGINS结构来解决这个问题:
Structure MARGINS
Public Left, Right, Top, Bottom As Integer
End Structure