当我创建一对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。如何才能做到这一点?
答案 0 :(得分:1)
你必须遍历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 Class特别注意:
请注意,不要为每个表单或容器创建多个ShapeContainer;这样做可能会引入意外行为。如果在编写代码以编程方式创建一个表单或容器之后向表单或容器添加设计时行或形状控件,则应修改该代码以使用设计器创建的ShapeContainer。