MFC SDI 程序
我在视图中显示了很多内容,其中在 CRect(10,10,100,60) 区域显示当前时间,如:【16:31:22】
这是个走动的电子表,需要用定时器每秒更新一次。
现在的问题是,我如何才能做到:只更新 (10,10,100,60) 这个区域,因为其它内容基本不需要变化。
我想应该使用 CWnd::InvalidateRect 函数,但我更新时间的代码写在什么地方?

解决方案 »

  1.   

    实际上CWnd::InvalidateRect只是帮你把矩形区域选入了DC剪裁区,如果只调用此函数而在绘图之前不做任何处理的话,米有任何作用,
    因此,建议在其他绘制调用之前,通过GetClipBox得到此矩形,如果发现就是电子表的矩形,则不绘制其他的,只做时间的绘制。
      

  2.   

    CRect r(10,10,100,60);
    InvalidateRect(&r,TRUE);
      

  3.   

    定时器中更新时间,InvalidateRect
      

  4.   


    请教 Mackz :
    我在试图中的 OnDraw 函数中是这样写的:
    // TODO: add draw code for native data here CRect rect;
    GetClientRect( rect ); // 画矩形边框
    pDC->Rectangle( rect.left+5, rect.top+5, rect.right-5, rect.bottom-5); // 显示视图中的其它内容
    pDC->DrawText( "Windows Mobile" ,
    rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    // 重点在这里,显示时间,如:10:41:20
    pDC->DrawText( m_str , CRect(0,0,100,100), DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    我的疑问是:调用 InvalidateRect 函数后,最后会执行到 OnDraw 函数;是不是又把 【画矩形】【显示 Windows Mobile】【显示时间】全部都重画了一遍?我的本意是,只更新【时间】部分。我对这部分不清楚,可能问的问题相当的幼稚;不过还是希望能简单的解释下!
      

  5.   

    操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
      

  6.   

    操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
      

  7.   

    操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
      

  8.   

    刚才恢复网站故障,一大段都白写了……简而言之,无效矩形之外的绘图都不起作用,但是函数调用开销还是有的;所以可以用GetClipBox判断一下是否需要绘制,不过对你的程序也不需要,因为绘制量太少。
      

  9.   

    仅仅调用InvalidateRect()而后不做判断,Rect以外的区域的绘制一样会执行。因此你需要自己取出ClipBox来处理。