图元被创建以后需要保存起来,以便于后面进行拾取、重画等操作。被选择的图元也要单独保存起来,后面的几何变换、删除等操作将只针对这部分单独保存起来的图元进行。利用.NET提供的集合类如ArrayList可以实现图元对象的保存。ArrayList类的功能很强大,利用它可以实现不同对象的添加、索引和删除。
具体应用时,需要首先创建ArraLit类的实例。如下所示,创建一个ges对象和一个geSels对象,分别实现所有图元的保存和被选中图元的保存。如果用VB.NET编程,可以将它们设置为全局变量。但VC#.NET中没有全局变量,可以在Form1类中声明,然后作为方法的参数进行传递。
code.vb.net
Public ges As New ArrayListO
Public geSels As New ArrayListO
集合类中图元的添加一般在图元创建完毕以后进行。下面是用于创建直线段的CCreaceLine 类中描述左键单击行为的部分代码。第2次单击鼠标左 以后,将新创焦的newLine对象添加到集合类中。
code.vb.net
Public Sub LButtonDown(ByVal g As Graphics,_
By Val aPos As PointF) Implements ICommand.LButtonDown
'记录鼠标左键的单击次数
m_Step +=1
Select Case m_Step
Case 1 '第1次单击鼠标左键
'…
Case 2 '第2次单击鼠标左键
'…
ges.Add(newLine)
'…
End Select
End Sub
选择图元时, 要遍历图元类ges中的元素,如果第i个元素被拾取,则用选择模式绘制它,并将它放到选择集geSels中去。
code.vb.net
Public Sub LButtonDown(ByVal g As System.Drawing.Graphics,
ByVal aPos As System.Drawing.PointF)
Implements CAD_Net.ICommand.LButtonDown
Dimi As Integer
For i=0 To ges.Count - 1
'如果图元被拾取,则用选择模式绘制图元
'并将该图元添加到选择集中去"
If(ges(i).Pick(aPos) = True) Then
ges(i).Draw(g,CGElement.geDrawMode.Selec)
geSels. Add(ges(i)
End If
Next
End Sub
图元被选到选择集中去以后,随后进行的变换操作和删除操作将只针对它们进行。下面的代码段将选择集中的图元进行平移变换。
code.vb.net
'如果选择集中的图元个数大于0
If geSels.Count >0 Then
For i=0 To geSels.Count - 1
'清除图元在当前位置上的图形
geSels(i).draw(g, CGElement.geDrawMode.Delete)
'将所有被选中的图元移动到目标位置并进行绘制
geSels(i).Move(g,m_basePos,m_desPos)
geSels(i).Draw(g, CGElement.geDrawMode.Selec)
Next j
End If