图元被创建以后需要保存起来,以便于后面进行拾取、重画等操作。被选择的图元也要单独保存起来,后面的几何变换、删除等操作将只针对这部分单独保存起来的图元进行。利用.NET提供的集合类如ArrayList可以实现图元对象的保存。ArrayList类的功能很强大,利用它可以实现不同对象的添加、索引和删除。
具体应用时,需要首先创建ArraLit类的实例。如下所示,创建一个ges对象和一个geSels对象,分别实现所有图元的保存和被选中图元的保存。如果用VC#.NET编程,可以将它们设置为全局变量。但VC#.NET中没有全局变量,可以在Form1类中声明,然后作为方法的参数进行传递。
code.vc#.net
private ArrayList ges=new ArrayList();
private ArrayList geSels=new ArrayList();
集合类中图元的添加一般在图元创建完毕以后进行。下面是用于创建直线段的CCreaceLine 类中描述左键单击行为的部分代码。第2次单击鼠标左 以后,将新创焦的newLine对象添加到集合类中。
code.vc#.net
public void LButtonDown(Graphics g,PointF aPos, ArrayList ges,ArrayList geSels)
{
//记录鼠标左键的单击次数
m_Step+=1;
switch(m_Step)
{
case 1:
//…
case 2:
//…
ges.Add(newLine);
//...
}
}
选择图元时, 要遍历图元类ges中的元素,如果第i个元素被拾取,则用选择模式绘制它,并将它放到选择集geSels中去。
code.vc#.net
public void LButtondown(Graphics g,Point aPos,ArrayList ges,ArrayList geSels)
{
for(inti=0;i<ges.Count;i++){
//如果图元被拾取,则用选择模式绘制图元
//并将该图元添加到选择集中去
if((CGElement)(ges[i]).Pick(aPos))
{
((CGElement(ges[i]).Draw(g,DrawMode.Selec);
geSels.Add(ges[i);
}
}
}
图元被选到选择集中去以后,随后进行的变换操作和删除操作将只针对它们进行。下面的代码段将选择集中的图元进行平移变换。
code.vc#.net
//将所有被选中的图元移动到目标位置并进行绘制
if(geSels.Count>0)
{
for(int i=0;i< geSels.Count;i++)
{
//清除图元在当前位置上的图形"
((CGElement)(geSels[i]).Draw(g.DrawMode.Delete);
((CGElement)(geSels[i]).Move(g.m_basePos,m_desPos);
((CGElement)(geSels[i]).Draw(g,DrawMode.Selec);
}
}