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 的 Shape 集合,而不是 Controls:

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 回答