继续,接下来需要做的是对鼠标点击的响应。我需要当鼠标点击客户区时,判断出鼠标的位置然后找到鼠标对应的输入输出,并且对鼠标锁对应的输入输出线的交点上做标记(画圆)。
流程很简单,首先还是遍历找到鼠标锁对应的输入输出,然后找到其交点,以交点为圆心,画一个圆。需要注意的是,因为输出只能对应一个输入,因此在同一输出线上,只能同时有一个圆。因此找到交点后首先需要判断这条输出线上是否有其他圆,有话就对此进行擦除。我采用的方法是定义一维动态数组,数组中存放输出线上的交点坐标,每次画圆之后保存输出线上的坐标点,下次画圆之前首先擦除这次保存的坐标点。另外,因为窗口的切换或者最小化都会导致客户区的重绘,因此每次绘图后需要将数据保存,在下次显示时重绘。代码如下:
void CMy123View::OnLButtonDown(UINT nFlags, CPoint point)
{
CFormView::OnLButtonDown(nFlags, point);
CRect rect(XLeft,YTop,XRight,YBotton);//定义画布大小
CDC* pDC=GetDC();
pDC->SetROP2(R2_NOTXORPEN);//设置二次绘图消除效果
CPen pen(PS_SOLID,2,RGB(255,0,0));//定义一个画笔
CPen* pOldPen=pDC->SelectObject(&pen);//选中画笔
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);//设置画刷背景为空
if ( rect.PtInRect( point ) )//判断鼠标是否在画布范围内
{
for( j=1;j<=N_InPut;j++)//遍历
{
CRect rc_x(XLeft+((XRight-XLeft)/N_Max*j)-(XRight-XLeft)/(2*(N_Max))+1,
YTop,
XLeft+((XRight-XLeft)/N_Max*j)+(XRight-XLeft)/(2*(N_Max))-1,
YBotton);
if(rc_x.PtInRect(point))
{
for( i=1;i<=N_OutPut;i++ )
{
CRect rc_y(XLeft,
YTop+((YBotton-YTop)/N_Max)*(i+1)-(YBotton-YTop)/(2*N_Max)+1,
XRight,
YTop+((YBotton-YTop)/N_Max)*(i+1)+(YBotton-YTop)/(2*N_Max)-1);
if(rc_y.PtInRect(point))
{
//pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);
int X0=XLeft+((XRight-XLeft)/N_Max*j);
int Y0=YTop+((YBotton-YTop)/N_Max)*(i+1);
int X1=X0-((XRight-XLeft)/(N_Max*3));
int Y1=Y0-((XRight-XLeft)/(N_Max*3));
int X2=X0+((XRight-XLeft)/(N_Max*3));
int Y2=Y0+((XRight-XLeft)/(N_Max*3));
m1[i]=X1;
n1[i]=Y1;
m2[i]=X2;
n2[i]=Y2;//保留此次绘图坐标
pDC->Ellipse(X1,Y1,X2,Y2);//画圆
}
}
}
}
}
ReleaseDC(pDC);注销pDC
}
上面是鼠标点击相应函数。重绘时需要在OnDraw()中加入以下代码:
for(i=1;i<N_Max;i++)
{
pDC->SetROP2(R2_NOTXORPEN);//定义二次绘图消除效果
CPen open(PS_SOLID,2,RGB(255,0,0));
CBrush* pOldBrush = (CBrush*)pDC-> SelectStockObject(NULL_BRUSH);
pDC->SelectObject(&open);
pDC->Ellipse(m1[i],n1[i],m2[i],n2[i]);//恢复
}