第一个问题:可以调用两次,系统自动会帮你计算无效区域;
第二个问题:应该不会出这个问题,除非你的程序有问题。一般总是在OnPaint中画全部的内容,而用InvalidateRect()刷新该刷新的区域。

解决方案 »

  1.   

    我是用定时器回调函数调用InvalidateRect(),在OnDraw()中更新无效区域画图。第一次InvalidateRect()的无效区域为整个客户区,画好要画的数据的网格,以后无效区域则设置为数据要更新的小区域,但是出现的效果却是需要全部重画,上一次画的数据图象都没有了
      

  2.   

    OnDraw()中更新无效区域画图
    不对。OnDraw()中是画图,更新无效区不能在这里。
    象你这个例子:
    OnDraw(CDC *pDC)
    {
        ......
        DrawGrid(pDC); // 画网格
        DrawData(pDC); // 画数据
        ......
    }在你的定时器回调函数调用InvalidateRect(&rc); 其中rc是要更新的无效区域。其他就不需要额外的代码了。如果你对无效区域有疑惑,可以先让整个客户区都刷新:InvalidateRect(NULL),看看结果效果,如果正确再作优化。