gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:43:39 24 4
gpt4 key购买 nike

我使用以下代码在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com