1

LineShapeオブジェクトとShapeContainerオブジェクトのペアを作成するときは、次のコードを使用してShapeContainerを親にします。

 myLS.Parent = mySC
 Me.Controls.Add(mySC)

次に、カーソル位置がLineShapeの終わり近くにあるときはいつでも、線の色を変更する必要があり、次のコードの実装を開始しました。

        Dim ClickedShapeContainerName As String = sender.Name
        Dim siSCId As Integer
        Dim myLS As New LineShape
        Dim mySC As New ShapeContainer
        'get ID of clicked ShapeContainer
        For Each c As Control In Me.Controls
            If c.Name = ClickedShapeContainerName Then
                mySC = CObj(c)
                If mySC.HasChildren Then
                    myLS =???????
                    siSCId = 1
                End If
                Exit For
            End If
        Next

        If siSCId > -1 Then
            If MouseIsNearBy(myLS.EndPoint) Then
                myLS.BorderColor = Color.Red
                NearLineEndPoint = True
            End If
        End If

Private Function MouseIsNearBy(ByVal testPoint As Point) As Boolean
        testPoint = Me.PointToScreen(testPoint)
        Return Math.Abs(testPoint.X - MousePosition.X) <= HitTestDelta AndAlso Math.Abs(testPoint.Y - MousePosition.Y) <= HitTestDelta
End Function

ただし、親ShapeContainerの子LineShapeを取得する方法を決定できないため、新しいLineShape( "myLS")を見つかった子と同じに設定できます。mySCはクリックされたShapeContainerに正常に設定されていますが、子LineShapeを上げることができません。これはどのように行うことができますか?

4

1 に答える 1

0

ShapeContainerのControlsではなくShapeコレクションをループする必要があります。

If Me.Controls.ContainsKey(clickedShapeContainerName) Then
  mySC = DirectCast(Me.Controls(clickedShapeContainerName), ShapeContainer)
  For Each ls As LineShape In mySC.Shapes
    If MouseIsNearBy(ls.EndPoint) Then
      ls.BorderColor = Color.Red
    End If
  Next
End If

LineShapeのMouseEnterイベントとMouseLeaveイベントをサブスクライブすることもできます。

また、ShapeContainerクラスには特別な注意があります。

フォームまたはコンテナごとに複数のShapeContainerを作成しないように注意してください。これを行うと、予期しない動作が発生する可能性があります。プログラムで作成するコードを記述した後で、デザインタイムラインまたはシェイプコントロールをフォームまたはコンテナに追加する場合は、デザイナーが作成したShapeContainerを使用するようにそのコードを変更する必要があります。

于 2013-01-04T21:24:24.317 に答える