0

我曾经使用以下代码在 VB 6.0 中更改表单形状:

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Sub MakeRoundObject(objObject As Object, Value As Long)
  Static lngHeight, lngLong, lngReturn, lngWidth As Long
  lngWidth = objObject.Width / Screen.TwipsPerPixelX
  lngHeight = objObject.Height / Screen.TwipsPerPixelY
  SetWindowRgn objObject.hWnd, CreateRoundRectRgn(10, 50, lngWidth, lngHeight, Value + 10, Value), True
End Sub

Private Sub Form_Load()
   Call MakeRoundObject(Form1, 50)
End Sub

以同样的方式,我使用 VB.NET 代码如下:

Imports Microsoft.VisualBasic.Compatibility

Public Class Form1
  Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal X3 As Integer, ByVal Y3 As Integer) As Integer
  Private Declare Function ReleaseCapture Lib "user32" () As Integer
  Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Integer, ByVal hRgn As Integer, ByVal bRedraw As Boolean) As Integer

  Private Sub MakeRoundObject(ByRef objObject As Object, ByRef Value As Integer)
    Static lngLong, lngHeight, lngReturn As Object
    Static lngWidth As Integer
    lngWidth = objObject.Width / VB6.TwipsPerPixelX
    lngHeight = objObject.Height / VB6.TwipsPerPixelY
    SetWindowRgn(objObject.hWnd, CreateRoundRectRgn(0, 0, lngWidth, lngHeight, Value, Value), True)

  End Sub

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MakeRoundObject(Me, 20)
  End Sub

End Class

但在后一种情况下,我收到一条错误消息 - “未找到类型 'Form1' 上的公共成员 'hWnd'。”

我所做的?

4

4 回答 4

4

您不必使用 P/Invoke 来执行此操作。Form.Region 属性就是为此而设计的。一个简单的例子:

Public Class Form1
  Public Sub New()
    InitializeComponent()
    Dim path As New Drawing2D.GraphicsPath()
    path.AddEllipse(0, 0, Me.Width, Me.Height)
    Me.Region = New Region(path)
  End Sub
End Class
于 2009-03-28T15:45:01.343 回答
0

另一种方法是将 TransparencyKey 设置为像洋红色这样的颜色或表单上未使用的任何其他颜色。然后将 BackgroundImage 属性设置为某些图像,洋红色将代表透明区域。通过该程序,您可以轻松获得任何形状。

于 2009-06-22T11:55:25.473 回答
0

该属性现在是 Handle,而不是 hWnd。

如果您打开 option strict ,那么编译器会告诉您 hWnd 不再存在。同样在 .NET 中,您应该使用 ByVal 而不是 ByRef,除非您需要调用者查看对该参数所做的更改的能力,否则传递 ByVal 不再会降低性能。您还应该将 MakeRoundObject Sub 的参数类型更改为正确的数据类型,而不是 Object。

于 2009-03-28T09:41:41.543 回答
0

也许另一种获得您可能没有想到的非矩形表单形状的方法:在表单上设置透明背景颜色并使用它。

我经常对 .NET 中的关于屏幕之类的事情执行以下操作:将背景颜色设置为实际表单中未使用的颜色(如深紫色)并使用 GDI+ 在表单边界内以您希望的颜色绘制填充形状.

实际上并没有将表单区域从矩形更改为其他内容,但它确实有效。并且通常更容易使用表单的“脱节形状”。

于 2009-03-28T10:31:17.010 回答