集合类

图元被创建以后需要保存起来,以便于后面进行拾取、重画等操作。被选择的图元也要单独保存起来,后面的几何变换、删除等操作将只针对这部分单独保存起来的图元进行。利用.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);
        }
    }