Отбрасывание тени на 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
Другие вопросы по тегам