OnDraw的功能本来就是全部重画,当窗口回到最前面、被遮住的部份又露了出来、窗口移动,就会调用OnDraw,在这些情况下,你无法让它只画一部份。
你可以自己让它只画某个部份,比如点击某个按钮后,把左上角那一块换成另一个样子,这时你就可以用CWnd::InvalidateRect而不要调用OnDraw,由它通知系统重画哪一部份。
另外你可以在论坛中搜索“重绘”,会找到很多这方面的解答。

解决方案 »

  1.   

    需要捕获鼠标。具体的函数的使用查找MSDN。
    A。 WM_LBUTTONDOWN 中捕获鼠标。SetCapture()
    B。 WM_LBUTTONUP 中释放捕获。::ReleaseCapture();
    C。 处理 WM_MOUSEMOVE,在消息处理函数中,这样:
    ...GetCapture(...)     //判断是否捕获了鼠标,如果没有捕获,不作处理。
    CDC *pDC = pView->GetDC();
    int nOldMode = pDC->SetROP2(R2_NOTXORPEN);
    pDC->Draw...(...);     //将原来的矩形用反相的方法重新绘制一次,以擦除原来的矩形
    pDC->SetROP2(nOldMode);
    pDC->Draw...(...);     //绘制新的的矩形
    ReleaseDC(pDC);
    ...            //保存这个新的矩形,用于下次重绘制
      

  2.   

    如果只是为了一个矩形
    可以采用CTrackRect