在WinForm上丢弃阴影扭曲界面

时间:2013-12-02 07:07:11

标签: vb.net winforms dropshadow

我正在使用以下代码在我的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使用传统的投影效果,它看起来过于“四四方方”并且不会产生很好的阴影效果。

以下是没有阴影和阴影的屏幕截图: Form without drop shadow Form with drop shadow

感谢。

1 个答案:

答案 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