MFC中,当鼠标点下时确定一点,然后鼠标弹起移动的话就会有一条线,连接现在鼠标的位置和之前确定的那一点,
就好象画图软件中那样,当你画一条线时,先确定一点,然后不管鼠标移动到哪里就有一条线连接鼠标当前位置和之前确定点。直到你再次按下鼠标时,就真的画一条线。

解决方案 »

  1.   

    先在WM_LBUTTONDOWN处理函数中用一个成员变量或是全局变量记录下鼠标位置。在WM_MOUSEMOVE中不停的用LineTo画线,注意的是因为要将前一次的线擦掉,所以你还要一个全局变量记录前一个WM_MOUSEMOVE的位置,用SetROP2(R2_NOT)设置绘图方式为擦除方式,在原来位置再画一次,将上次的擦掉。
      

  2.   


    void CTView::OnLButtonDown(UINT nFlags, CPoint point) {       // TODO: Add your message handler code here and/or call default       m_StartPoint=point;       m_LastEndPoint=point;       SetCapture();       CView::OnLButtonDown(nFlags, point);} void CTView::OnLButtonUp(UINT nFlags, CPoint point) {       // TODO: Add your message handler code here and/or call default       if(GetCapture()==this)       {              CClientDC dc(this);              ReleaseCapture();              dc.MoveTo(m_StartPoint);              dc.LineTo(point);       }       CView::OnLButtonUp(nFlags, point);} void CTView::OnMouseMove(UINT nFlags, CPoint point) {       // TODO: Add your message handler code here and/or call default       if(nFlags && MK_LBUTTON)       {              CClientDC dc(this);              int nDrawMode=dc.GetROP2();              dc.SetROP2(R2_NOTXORPEN);              dc.MoveTo(m_StartPoint);              dc.LineTo(m_LastEndPoint);              dc.MoveTo(m_StartPoint);              dc.LineTo(point);              m_LastEndPoint=point;              dc.SetROP2(nDrawMode);       }       CView::OnMouseMove(nFlags, point);}
      

  3.   

    OnLButtonDown()  
        if(temp == FALSE)
            {
                  mPointOrigin=point;//the first point left_top
                    temp == Ture;
            }
        else
         {
            CPen *pOldPen;
    CPen LinePen(PS_DOT,1,RGB(255,0,0));
    pOldPen  =  ClientDC.SelectObject(&LinePen);
    ClientDC.SelectStockObject(HOLLOW_BRUSH); 
    ClientDC.SetROP2(R2_NOT);
    ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
    ClientDC.LineTo(point.x, point.y);
    ClientDC.SetROP2(R2_COPYPEN);
    ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
            ClientDC.LineTo(point.x,point.y);
         }
    OnMouseMove()        ClientDC.SetROP2(R2_NOT);
    CPen *pOldPen;
    CPen LinePen(PS_DASH,1,RGB(255,0,0));
    pOldPen = ClientDC.SelectObject(&LinePen);
    ClientDC.SetBkMode(TRANSPARENT);
    ClientDC.SelectStockObject(NULL_BRUSH);
    ClientDC.SetROP2(R2_NOT);
    ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
    ClientDC.LineTo(mPointOld.x,   mPointOld.y);
    ClientDC.MoveTo(mPointOrigin.x,mPointOrigin.y);
    ClientDC.LineTo(point.x,point.y);
      

  4.   

    这是我以前写的一段代码(橡皮筋算法),放在OnMouseMove中的
    CClientDC pDC(this);
    OnPrepareDC(&pDC);
    pDC.DPtoLP(&point);
    pDC.SetROP2(R2_NOT);        //设置异或
    xx=point.x ;
    yy=point.y ;               //这两行对你应该没用,是显示坐标用的
    sprintf(p1,"%4d",xx);
    m_wndStatusBar.SetPaneText(2,p1,TRUE);
    sprintf(p1,"%4d",yy);
    m_wndStatusBar.SetPaneText(3,p1,TRUE);
    if(MenuID==1&&PressNum==1) //条件
    {
    if(mPointOld!=point)
    {
    pDC.MoveTo(mPointOrigin);pDC.LineTo(mPointOld);//擦旧线
    pDC.MoveTo(mPointOrigin);pDC.LineTo(point);    //画新线
    mPointOld=point;
    }
            }