选择图元

把图元放到单独的选择集中的过程称为选择图元。图元被拾取到以后,如果希望对它进行某种后续操作,可以先把它放到一个单独的集合类里面,后面的特定操作如几何变换、删除等操作将只针对该集合类中的图元进行。选择图元的方法很多,常见的有鼠标单选、线选、窗选、多边形选择等。被选择的图元可以用不同颜色或线型显示。

5.2.1添加菜单资源

选择图元,需要首先添加相应的菜单资源,如图5-2所示。在第3章和第4章创建的CAD程序的基础上,在窗体主菜单中添加一个“编辑”菜单。菜单中主要包括4个选项,即“选择”、“全选”、“放弃选择”和“删除”,分别实现图元的逐个选择、全选、放弃选择和删除。各选项的名称分别为mnuSelect,.mnuSelAll,mnuDeSel和mnuDelete。

Document Image
\[\]

图5-2在主菜单中添加“编辑”菜单

5.2.2鼠标单选

为了实现鼠标单选,首先创建一个CSelect类。该类实现了ICommand接口。当鼠标左键按下时,如果鼠标下方的图元被拾取,则该图元被添加到选择集gSls中。

code.vc#.net
	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,即

code.vc#.net
		public selected As New Cselect()

如果使用的是VC#.NET,首先在Form1类中创建CSelect类实例sel:

code.vc#.net
		private CSelect sel=new Cselect();

然后在Form1类中添加下面的代码:

code.vc#.net
		private void mnuSelect_Click(object sender, System.EventArgs e)
		{
		    aCommand=sel;
		}

这样,在"编辑"菜单中单击菜单项"选择"以后,可以用鼠标单选图元。单选图元的效果如图5-3所示。

Document Image
\[\]

图5-3单选图元

全选

全选图元需要将所有图元都放到选择集中去,并且把所有图元都以选择模式重画。

code.vc#.net
		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过程将选择集中的所有图元用选择模式重画。

code.vc#.net
		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所示。"

Document Image
\[\]

图5-4全选图元

5.2.4放弃选择

放弃选择操作将选择集中的图元以正常模式重绘,然后清空选择集。

code.vc#.net
		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);
		}

添加上面的代码以后,运行程序,在“编辑”菜单中单击“放弃选择”选项,当前绘图区中被选中的图形恢复到正常模式的绘制状态。