我在 OnDraw() 函数里显示了一幅 BMP 图像,然后用 GDI 来绘制一个固定大小的矩形框,我想实现的是每次鼠标移动,都以鼠标当前在的 位置为 矩形框的左上角坐标,重新画矩形,我是把 画矩形的代码放在鼠标移动的响应函数中的:void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default ax=0;
ay=0; ax=point.x;
ay=point.y; //////////////////////////////////////
//画矩形
CDC* pDC=GetDC(); CPen pen(PS_SOLID,3,RGB(255,0,0));
CPen* OldPen=pDC->SelectObject(&pen);
pDC->Rectangle(ax,ay,ax+180,ay+114);
pDC->SelectObject(OldPen);

///////////////////////////////////////
CScrollView::OnMouseMove(nFlags, point);
}
这样是可以每次鼠标移动都画矩形,但是之前画的那些矩形框都还在,请问怎么样才可以把之前画的矩形框全都删除?只保留当前最新画的这个?我试过,要是把画矩形框的代码放到 OnDraw() 函数中,在OnMouseMove()函数中更新矩形左上角的坐标值,但是这样的话,画面上就只剩下第一次画的那个矩形框,鼠标移动后,画面上都不显示第一次之后画的矩形框,要如何才能实现矩形框的实时更新而且把之前画的矩形框都去掉? 

解决方案 »

  1.   

    Rectangle之前调用一次Invalidate应该可以抹去之前的矩形。
    但是效率很低。
      

  2.   

    画矩形框的代码放到 OnDraw() 函数中
    在OnMouseMove()函数中更新矩形左上角的坐标值,然后调用Invalidate/InvalidateRect更新重画
      

  3.   


    如果我在 OnMouseMove()函数或者是 OnTimer() 函数中调用Invalidate 来刷新的话,
    画面闪烁的很厉害啊,这个怎么解决?谢谢各位!
      

  4.   

    使用双缓冲技术,相关代码google一下,很多的
      

  5.   

    使用InvalidateRect来设置无效区域,不整个客户区更新
    使用双缓冲
      

  6.   

    那就不要整个客户区都刷新,用InvalidateRect把不需要刷新的地方置成无效就可以了
      

  7.   

    设置反色SetROP2(hdc,R2_NOT) ;
    原位置从新画就能擦出了