我想知道,InvalidateRect应该是调用OnPaint(),但是InvalidateRec(rectOld,FALSE);先调用后,然后InvalidateRect(rectNew, FALSE);调用,是先将rectOld擦除,然后再对rectNew绘制,为什么同样函数能将旧的擦除,能将新的显示阿.
程序如下:
                  CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectOld(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectOld);
InvalidateRect(rectOld, FALSE);
m_pointTopLeft = point - m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);
CRect rectNew(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectNew);
InvalidateRect(rectNew, FALSE);
然后我想知道具体的函数调用的过程,InvalidateRect应该触发一个事件,对视图重新绘制的吧,然后具体的绘制是如何实现的.

解决方案 »

  1.   

    重绘一个矩形区域
    MFC没有实现代码
      

  2.   

    InvalidateRect()
    是指让操作系统对窗口指定区域无效,并没有进行无效后画操作,
    因为你当前执行的函数还没有结束。
    等你操作结束后,系统消息循环会再次调用你的OnPaint()进行重画,这时才执行画操作。达到目的,可以在InvalidateRect()调用后,再调用UpdateWindoow()就可以了。
      

  3.   

    <Programming Windows>  by  Charles Petzold
    //////////////////////////////////////////////////////////////
    有效矩形和无效矩形尽管窗口消息处理程序一旦接收到WM_PAINT消息之后,就准备更新整个显示区域,但它经常只需要更新一个较小的区域(最常见的是显示区域中的矩形区域)。显然,当对话框覆盖了部分显示区域时,情况即是如此。在擦除对话框之后,需要重画的只是先前被对话框遮住的矩形区域。这个区域称为「无效区域」或「更新区域」。正是显示区域内无效区域的存在,才会让Windows将一个WM_PAINT消息放在应用程序的消息队列中。只有在显示区域的某一部分失效时,窗口才会接受WM_PAINT消息。Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。窗口消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。如果消息队列中已经包含一个WM_PAINT消息,Windows将计算出新的无效矩形。否则,它将一个新的WM_PAINT消息放入消息队列中。在接收到WM_PAINT消息时,窗口消息处理程序可以取得无效矩形的坐标(我们马上就会看到这一点)。通过呼叫GetUpdateRect,可以在任何时候取得这些坐标。
      

  4.   

    InvalidateRect(&rect)
    使矩形区域无效,系统发WM_PAINT消息重绘无效区域
      

  5.   

    1. InvalidateRect不是调用OnPaint()
    2. InvalidateRect(rectNew, FALSE) 仍然是使rectNew区域无效
    当你的主线程处理消息队列时发现有WM_PAINT消息的时候才会分派到具体窗口的
    WindowProc窗口过程去处理从而激发OnPaint把无效的区域重绘出来