以一个函数,用以完成图形重画的功能,该函数如下:void CDrawView::OnGraphRedraw() 
{
CDrawDoc* pDoc = GetDocument(); //得到文档的指针
Invalidate();
pDoc->UpdateAllViews(this);
}    请问为何同时调用,调用的先后顺序有何差别。

解决方案 »

  1.   

    Invalidate(); //是把客户区域编程无效区域, 并发送wm_paint到消息队列中来重画.UpdateAllViews(this); //是立即重画所有view, 但不包括此view.只有这样调用才能使得此视图改变后 所有相关的视图也被更新.
      

  2.   

    个人觉得,应该以来UpdateAllViews来实现视图更新,而Invalidate不应该调用。此函数应该是在OnUpdate里调用!!写这段代码的人没有很好的规划好,才出现同时调用的情况几个要点:
    1。每个视图必须在doc更新时更新自己,而Doc通过UpdateAllViews通知各个视图
    2. 如果视图需要绘制界面,必须Invalidate或者InvalidateRect
    因此在OnUPdate中,Invalidate/InvalidateRect是对于需要绘制的视图是必须的。但是在上述函数中,实际是不必须的。如果楼上代码改成pDoc->UpdateAllViews(NULL);则应该可以把Invalidate删除 
      

  3.   

    同时调用确实不合理,有UpdateAllViews足矣