InvalidateRect可以产生WM_PAINT啊,那不就是不断循环调用InvalidateRect产生无数WM_PAINT了?
解决方案 »
- C++程序调用C程序中的一个方法,链接出错
- 为何同样的程序在Win7双核CPU下运行CPU占有率为90%以上,而在XPe双核下为50%左右?
- CListCtrl 行 提示
- 如何启动exe的快捷方式?通过CreateProcess()可以吗?
- 一般遍历ACCESS2000数据库中的一个拥有一万条记录的表,从头到尾的要多长时间?
- ado对数据库编程怎么和winsock结合
- vc编辑一个简单的程序
- 请教从csdn朋友中得到的找硬盘序列号方法都不很稳定,请问是什么原因?
- 求解 sqlite sqlite3 busy handler 用法
- 请教:怎样把成员函数删干净?
- VS2008下单文档项目在CMainFrame中添加CDialogBar为何无法显示?
- 如何在MDI程序中新建一个窗口
---------
能不能再解释的清楚点?不太明白
简单点说就是:你调用了InvalidateRect,系统不会马上发生WM_PAINT,而是抽空再给你发一个WM_PAINT。
系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽 可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update Region是否为空等。