我在某个地方使用dc.FillRect()画了一个矩形,然后我希望当移动鼠标时移动这个矩形,并将原先画的矩形的位置的背景回复到未画矩形的状态,该如何做?
我不希望使用InValidate()重画整个窗口的方式。

解决方案 »

  1.   

    InValidate()是个好办法
    但是效率有点低,可能出现闪烁,但是你用了内存DC的话,把0nDraw函数写好点,绝对能另你满意,这是消除闪烁最好的办法
      

  2.   

    在OnMouseMove里面处理,同时在CDocument中保存数据,以便OnDraw的时候绘制
      

  3.   

    哪用那么复杂。用dc.SetROP2( R2_XORPEN );模式即可
    你移动鼠标时移动这个矩形,再画新位置的矩形前,先将DC设为R2_XORPEN 模式,然后新画上次矩形位置(因为是XORPEN模式,所以实际是擦除),然后将R2_XORPEN 模式换为正常,在新位置上画矩形就可以了。(注意要设个变量记住上一次的矩形位置)
      

  4.   

    你可以用InvalidateRect(CRect /*原来矩形的Rect*/);的形式每次只让需要重绘的地方无效
    这样要好一些!
      

  5.   

    我觉得NEWFree的回答好像不对,我用dc.SetROP2(R2_XORPEN)重画两次矩形并没有出现实现象
    画线那般的橡皮筋效果呀!
      

  6.   

    //一段代码,供你参考
    void CLineState::OnMouseMove(UINT nFlags, CPoint point)
    {
    CMyView *pView = (CMyView*)m_pView;
    ::SetCursor(::LoadCursor(NULL,IDC_CROSS));
    if( m_org.x >=0 && m_org.y >= 0 )
    {
    CClientDC dc( pView ); pView->OnPrepareDC( &dc ); CPen pen,* oldPen; int mode;

    int backmode;
    COLORREF BkColor = pView->GetDocument( )->m_backGroundColor ;
    pen.CreatePen( PS_SOLID, pView->m_thick, dc.GetNearestColor( BkColor ^ pView->m_lineColor ) );
    mode = dc.SetROP2( R2_XORPEN );
    oldPen = dc.SelectObject( &pen );
    //////////////////////////////////////////////////
    dc.MoveTo( m_org );
    dc.LineTo( m_last ); m_last = point;
    dc.DPtoLP( &m_last ); dc.MoveTo( m_org );
    dc.LineTo( m_last );
    dc.SetROP2( mode );
    dc.SelectObject( oldPen );
    pen.DeleteObject();
    }
    else// Not in Drag method
    {
    CStateMenu::OnMouseMove(nFlags, point);
    }
    }