vb.net - WinForm 上的阴影会扭曲界面

标签 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

谢谢。

最佳答案

  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

关于vb.net - WinForm 上的阴影会扭曲界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20322637/

相关文章:

.net - 在 .NET 中将字符串转换为 System.Color

html - VB.net HTTP GET block

C#读取Excel文件时出错,这是一个奇怪的错误

c# - 空字符串是空引用?

css - 模拟 "filter: drop-shadow"行为以获得更好的浏览器支持

iphone - 绘制带有渐变和阴影的圆形 UIView

vb.net - 如何创建运行时 timer.tick 事件?

.net - 在当前行的开头插入字符 (vb.net)

c# - 窗体右上角有X的按钮,如何捕捉这个事件@C#

javascript - 饼图投影或 3D d3.js