把图元放到单独的选择集中的过程称为选择图元。图元被拾取到以后,如果希望对它进行某种后续操作,可以先把它放到一个单独的集合类里面,后面的特定操作如几何变换、删除等操作将只针对该集合类中的图元进行。选择图元的方法很多,常见的有鼠标单选、线选、窗选、多边形选择等。被选择的图元可以用不同颜色或线型显示。
5.2.1添加菜单资源
选择图元,需要首先添加相应的菜单资源,如图5-2所示。在第3章和第4章创建的CAD程序的基础上,在窗体主菜单中添加一个“编辑”菜单。菜单中主要包括4个选项,即“选择”、“全选”、“放弃选择”和“删除”,分别实现图元的逐个选择、全选、放弃选择和删除。各选项的名称分别为mnuSelect,.mnuSelAll,mnuDeSel和mnuDelete。
图5-2在主菜单中添加“编辑”菜单
5.2.2鼠标单选
为了实现鼠标单选,首先创建一个CSelect类。该类实现了ICommand接口。当鼠标左键按下时,如果鼠标下方的图元被拾取,则该图元被添加到选择集gSls中。
public class CSelect:ICommand
{
public CSelect()
{
}
//单击鼠标左键时的绘图行为
public void LButtonDown(Graphics g, PointF aPos,ArrayList ges,ArrayList geSels)
{
for(int i = 0;i<ges.Count;i++){
//如果图元被拾取,则用选择模式绘制图元
//并将该图元添加到选择集中去
if(((CGElement)(ges[i])).Pick(aPos))
{
((CGElement)(ges[i])).Draw(g, DrawMode.Selec);
geSels.Add(ges[i]);
}
}
}
public void MouseMove(Graphics g, PointF aPos)
{
}
public void RButtonDown(Graphics g, PointF aPos)
{
}
}
创建CSelect类以后,如果使用的是VC#.NET,首先在Module1模块中创建一个CSelect类的实例selected,即
public selected As New Cselect()
如果使用的是VC#.NET,首先在Form1类中创建CSelect类实例sel:
private CSelect sel=new Cselect();
然后在Form1类中添加下面的代码:
private void mnuSelect_Click(object sender, System.EventArgs e)
{
aCommand=sel;
}
这样,在"编辑"菜单中单击菜单项"选择"以后,可以用鼠标单选图元。单选图元的效果如图5-3所示。
图5-3单选图元
全选
全选图元需要将所有图元都放到选择集中去,并且把所有图元都以选择模式重画。
private void mnuSelAll_Click(object sender, System.EventArgs e)
{
Graphics g= this.CreateGraphics();
for(int i = 0;i<ges.Count;i++)
{
geSels.Add(ges[i]);
}
m.DrawSel(g,geSels);
}
上面的代码中,DrawSel过程将选择集中的所有图元用选择模式重画。
public void DrawSel(Graphics g,ArrayList geSels){
for(int i = 0;i<geSels.Count;i++)
{
CGElement ge=(CGElement)(geSels[i]);
ge.Draw(g, DrawMode.Selec);
}
}
运行程序以后,在"编辑"菜单中单击"全选"菜单项,选择当前绘图区中的所有图元。全选效果如图5-4所示。"
图5-4全选图元
5.2.4放弃选择
放弃选择操作将选择集中的图元以正常模式重绘,然后清空选择集。
private void mnuDesel_Click(object sender, System.EventArgs e)
{
Graphics g= this.CreateGraphics();
for(int i = 0;i<geSels.Count;i++)
{
((CGElement)(geSels[i])).Draw(g, DrawMode.Normal );
}
geSels.RemoveRange(0, geSels.Count);
}
添加上面的代码以后,运行程序,在“编辑”菜单中单击“放弃选择”选项,当前绘图区中被选中的图形恢复到正常模式的绘制状态。