Отбрасывание тени на WinForm искажает интерфейс
Я использую следующий код для создания эффекта тени в стиле Windows7 на моих WinForms:
<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
Результат приведенного выше кода создает приятный эффект тени на моей безграничной форме win, но это приводит к искажению интерфейса. Все элементы управления и метки в моей форме не отображаются должным образом, текст не читается.
Я что-то здесь упускаю? Я не хочу использовать традиционный эффект падающей тени с помощью CreateParams, он слишком "квадратный" и не дает хорошего эффекта тени.
Вот скриншоты без тени и с тенью:
Благодарю.
1 ответ
Dim m As New Margins(0, 0, 0, 0)
Здесь видна тонкая ошибка, похоже, что вы используете System.Drawing.Printing.Margins. Но этот тип не совместим с типом MARGINS в Windows. Который является структурой, а не классом.
Так что это просто идет не так, как надо, Windows читает глупости вместо (0, 0, 0, 0). И расширяет рамку на всю клиентскую зону. Который затем наносит ущерб любому элементу управления, который рисует с помощью GDI, это API рисования 24bpp, который оставляет альфа на 0, поэтому все, что должно быть черным, становится прозрачным.
Исправьте это, объявив правильную структуру MARGINS:
Structure MARGINS
Public Left, Right, Top, Bottom As Integer
End Structure