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

0

おそらく、あなたが考えていなかったかもしれない非長方形のフォーム形状を取得する別の方法:フォームに透明な背景色を設定し、それを操作します。

.NETの画面についてなど、次のことをよく行います。背景色を実際のフォームでは使用されない色(濃い​​紫色など)に設定し、GDI +を使用して、フォームの境界内に希望の色で塗りつぶされた図形を描画します。 。

フォーム領域を長方形から別のものに実際に変更することはありませんが、機能します。また、フォームの「ばらばらの形状」を使用すると、多くの場合簡単になります。

于 2009-03-28T10:31:17.010 に答える
0

もう 1 つの方法は、TransparencyKey をマゼンタなどのフォームで使用されていない色に設定することです。次に、マゼンタ色が透明な領域を表す画像に BackgroundImage プロパティを設定します。この手順を使用すると、最小限の労力で任意の形状を取得できます。

于 2009-06-22T11:55:25.473 に答える
0

プロパティは、hWnd ではなく、Handle now です。

オプション strict をオンにすると、コンパイラは hWnd がもう存在しないことを通知します。また、.NET では、ByRef ではなく ByVal を使用する必要があります。呼び出し元がそのパラメーターに加えられた変更を確認する機能が必要な場合を除きます。ByVal を渡すことでパフォーマンスが低下することはありません。また、MakeRoundObject Sub のパラメーターの型を Object ではなく正しいデータ型に変更する必要があります。

于 2009-03-28T09:41:41.543 に答える