我在定义的一个区域中画一条垂直标尺线,在移动鼠标时,标尺线随着鼠标移动,代码如下:void CurveDevice::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default

m_Current_Ruler_XY=point;
DrawMoveLine(GetDC(),m_Current_Ruler_XY);
CStatic::OnMouseMove(nFlags, point);
}void CurveDevice::DrawMoveLine(CDC *pDC,CPoint point) //画鼠标移动的标尺线
{ CPen pen(PS_SOLID,1,m_RulerLineColor);
         CPen *oldPen=pDC->SelectObject(&pen); pDC->SetROP2(R2_XORPEN); pDC->MoveTo(point.x , 0);
pDC->LineTo(point.x , CD_Height);
pDC->SelectObject(oldPen);
}
现在有个问题:
   我移动鼠标时,以前画的线消隐得很慢,有拖尾,如何解决

解决方案 »

  1.   

    余认为:
    是不是在OnDraw(OnPaint)中重画线 比较好?(用InvalidateRect())
      

  2.   

    在OnLeftButtonUp()中调用DrawMoveLine而不是在OnMouseOver()中,因为Mouse一直在动,所以程序要引发好多个OnMouseOver事件。
      

  3.   

    我在Single  document下是这样实现的,你看一看,也许有帮助//x,y是CEXAM016View类的两个成员变量,记录鼠标移动时的坐标void CEXAM016View::OnDraw(CDC* pDC)
    { CEXAM016Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CPen pen(PS_SOLID,1,RGB(0,255,255));
              CPen *oldPen=pDC->SelectObject(&pen);
    pDC->MoveTo(x , y);
    pDC->LineTo(x , 300);
    pDC->SelectObject(oldPen);
    }void CEXAM016View::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    x=point.x;
    y=point.y;
    Invalidate(); CView::OnMouseMove(nFlags, point);
    }
      

  4.   

    不好意思,以前没有细看你的程序。
    在这里你应该不用异或(SetROP2(R2_XORPEN);)的方法,而应该直接用覆盖的方法画,效率不会有问题的。
      

  5.   

    另,上述方法应在ondraw里面画。这是为了保证以前的线被清除。如果你一定要用你现在的代码结构的话,应该像我开始说的那样,保留鼠标上一个点的坐标,画线函数里面画两次,第一次按原来的高度画一次(异或),清除旧线,第二次(异或)画新线。