请教一个在视图中刷新时间的问题

zaodt 2008-09-10 04:36:45
MFC SDI 程序


我在视图中显示了很多内容,其中在 CRect(10,10,100,60) 区域显示当前时间,如:【16:31:22】


这是个走动的电子表,需要用定时器每秒更新一次。


现在的问题是,我如何才能做到:只更新 (10,10,100,60) 这个区域,因为其它内容基本不需要变化。


我想应该使用 CWnd::InvalidateRect 函数,但我更新时间的代码写在什么地方?
...全文
110 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hiiishe 2008-09-11
  • 打赏
  • 举报
回复
仅仅调用InvalidateRect()而后不做判断,Rect以外的区域的绘制一样会执行。因此你需要自己取出ClipBox来处理。
菜牛 2008-09-11
  • 打赏
  • 举报
回复
刚才恢复网站故障,一大段都白写了……

简而言之,无效矩形之外的绘图都不起作用,但是函数调用开销还是有的;所以可以用GetClipBox判断一下是否需要绘制,不过对你的程序也不需要,因为绘制量太少。
菜牛 2008-09-11
  • 打赏
  • 举报
回复
操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
菜牛 2008-09-11
  • 打赏
  • 举报
回复
操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
菜牛 2008-09-11
  • 打赏
  • 举报
回复
操作系统对绘图的优化,就是在无效矩形之外的绘制统统无效;比如画矩形边框那句,如果无效矩形比画的区域小,那么真正更新的只有无效区域部分;如果无效区域和画的区域交叉,那么只有交叉部分是真正绘制更新的;如果无效区域和绘制区域不相交,那么这句就是空的,什么也不做(当然函数调用开销还是有的)。所以,用GetClipBox判断绘制区域可以减少调用函数的开销,但是不判断也不会影响绘制结果。
zaodt 2008-09-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Mackz 的回复:]
定时器中更新时间,InvalidateRect
[/Quote]

请教 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】【显示时间】全部都重画了一遍?



我的本意是,只更新【时间】部分。



我对这部分不清楚,可能问的问题相当的幼稚;不过还是希望能简单的解释下!
菜牛 2008-09-11
  • 打赏
  • 举报
回复
定时器中更新时间,InvalidateRect
shakaqrj 2008-09-11
  • 打赏
  • 举报
回复
CRect r(10,10,100,60);
InvalidateRect(&r,TRUE);
Hiiishe 2008-09-10
  • 打赏
  • 举报
回复
实际上CWnd::InvalidateRect只是帮你把矩形区域选入了DC剪裁区,如果只调用此函数而在绘图之前不做任何处理的话,米有任何作用,
因此,建议在其他绘制调用之前,通过GetClipBox得到此矩形,如果发现就是电子表的矩形,则不绘制其他的,只做时间的绘制。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧