InvalidateRect( CRect *)

来源:百度知道 编辑:UC知道 时间:2024/09/18 07:12:07
程序在调用invalidaterect的时候也要执行OnPaint()函数,在调用Invalidate()时也执行的OnPaint()函数,为什么样第一个效率要高一点呢。

做了个测试工程,不能上存附件。

在编程时只知道第一个是重绘部分区域,第二个是重绘整个区域。但不知道执行的同样的代码效率怎么产生的啊?
我的测试工程是这样的:在一个基对话框工程定义了两个矩形m_rc1,m_rc2;
并添加三个按钮,分别执行的是
InvalidateRect( &m_rc1 );
InvalidateRect ( &m_rc2 );
Invaluidate();

OnPaint()中的主要代码如下:
dc.FillSolidRect(&m_rc1, m_bSwitch ? RGB(255,0,0) : RGB(0,0,255) );
dc.FillSolidRect(&m_rc2, m_bSwitch ? RGB(0,0,255) : RGB(255,0,0) );
m_bSwitch=!m_bSwitch;

跟踪发现三个函数执行的是同一个代码。

望大家赐教.

09-8-3
关键是我的OnPaint()函数里,重绘了两个矩形,而我的第一个按钮 只是invalidaterect(&m_rc1),第二个矩形区确实没有重绘啊。

InvalidateRect(&Rect)和Invalidate()两个函数形式和功能差不多,但Invalidate是使得整个窗口无效,形成无效矩形,而InvalidateRect(&Rect)是
使得指定的区域无效。
如果你的OnPaint比较简单时,InvalidateRect(&Rect)和Invalidate()区别不是很大,因为相对重绘量少,所以整个重绘和局部重绘区别不是很明显。当你界面比较复杂时,重绘全部和重绘局部的量就比较明显,InvalidateRect(&Rect)明显效率高于Invalidate()。但是InvalidateRect(&Rect)需要你自己判断哪些区域是无效,而Invalidate()不需要(因为它是全部重绘)。所以当全部重绘的计算量高于判断局部无效的计算量时,更适合使用InvalidateRect(&Rect)。
多个WM_PAINT消息之间通过InvalidateRect使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的。