CCreateRectangle类用于描述交互绘制矩形时对鼠标事件的响应,它实现了ICommand接口。与CCreateLine类中一样,定义了3个局部变量:m_Step记录鼠标左键的单击次数,m_basePos和m_desPos分别记录矩形绘制的起点和终点。
第1次单击鼠标左键时,单击点定义为绘制矩形的起点,同时矩形的终点也初始化为鼠标单击点。
第2次单击鼠标左键时,确定终点的位置。以拖曳方式重绘最后一个橡皮矩形,将它从屏幕上清除。然后用正常模式绘制当前位置的矩形,并将它添加到图元集合类中。绘制完成以后,将m_Step的值归0。
code.vc#.net
public class CCreateRectangle:ICommand
{
private int m_Step;
private PointF m_basePos;
private PointF m_desPos;
public CCreateRectangle()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void LButtonDown(Graphics g,PointF aPos,ArrayList ges,ArrayList geSels)
{
PointF prePos=new PointF();
//记录鼠标左键的单击次数
m_Step+=1;
switch(m_Step)
{
case 1:
m_basePos=aPos;
m_desPos=aPos;
break;
case 2:
//重绘并删除前一位置的直线段
prePos=m_basePos;
CRectangle tempRect=new CRectangle(m_basePos,m_desPos);
tempRect.Draw(g,DrawMode.Drag);
tempRect=null;
//绘当前位置的直线段
m_basePos=prePos;
m_desPos=aPos;
CRectangle newRect=new CRectangle(m_basePos,m_desPos);
newRect.Draw(g,DrawMode.Normal);
ges.Add(newRect);
m_Step=0;
break;
}
}
}
鼠标左键第1次单击以后,移动鼠标时触发窗体的MouseMove事件。这里用MouseMove方法描述移动鼠标时绘图区的响应,它实现了ICommand 接口的MouseMove方法。移动鼠标时,在绘图区绘制橡皮矩形。在绘制过程中,橡皮矩形的起点是不变的,而终点,即起点的对角顶点随鼠标光标位置的变化而变化。使用拖曳绘图模式,不断清除前一位置的橡皮矩形并绘制当前位置的橡皮矩形,然后将当前矩形的终点进行记录,作为绘制下一个橡皮矩形的前一个终点,以便清除该矩形。
code.vc#.net
public void MouseMove(Graphics g,PointF aPos)
{
switch(m_Step)
{
case 1:
PointF prePos=new PointF();
PointF curPos=new PointF();
prePos=m_desPos;
curPos=aPos;
CRectangle tempRect1=new CRectangle(m_basePos,prePos);
tempRect1.Draw(g,DrawMode.Drag);
tempRect1=null;
//绘当前位置的直线段
CRectangle tempRect2=new CRectangle(m_basePos,curPos);
m_desPos=curPos;
tempRect2.Draw(g,DrawMode.Drag);
tempRect2=null;
break;
}
}
第1次单击鼠标左 并移动鼠标以后,屏幕上留下一个橡皮矩形,此时如果想取消操作,可以用下面的RButtonDown方法实现,它实现了ICommand接口的RButtonDown方法。该方法在屏幕上清除最后一个橡皮矩形,并将m_Step设置为0。
code.vc#.net
//单击鼠标右键的绘图行为
public void RButtonDown(Graphics g,PointF aPos)
{
if(m_Step==1)
{
CRectangle tempRect=new CRectangle(m_basePos,m_desPos);
tempRect.Draw(g,DrawMode.Drag);
tempRect=null;
}
m_Step=0;
}