VC菜鸟之路03_利用MFC绘制动态矩阵图——03

来源:互联网 发布:安全员模拟考试软件 编辑:程序博客网 时间:2024/05/21 01:52

  继续,接下来需要做的是对鼠标点击的响应。我需要当鼠标点击客户区时,判断出鼠标的位置然后找到鼠标对应的输入输出,并且对鼠标锁对应的输入输出线的交点上做标记(画圆)。

  流程很简单,首先还是遍历找到鼠标锁对应的输入输出,然后找到其交点,以交点为圆心,画一个圆。需要注意的是,因为输出只能对应一个输入,因此在同一输出线上,只能同时有一个圆。因此找到交点后首先需要判断这条输出线上是否有其他圆,有话就对此进行擦除。我采用的方法是定义一维动态数组,数组中存放输出线上的交点坐标,每次画圆之后保存输出线上的坐标点,下次画圆之前首先擦除这次保存的坐标点。另外,因为窗口的切换或者最小化都会导致客户区的重绘,因此每次绘图后需要将数据保存,在下次显示时重绘。代码如下:

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]);//恢复
 }

 

做到这一步,绘图方面基本上就完成了,剩下的就是功能函数了,效果图如下:

原创粉丝点击