系统何时发送WM_PAINT消息
2015-04-14 11:08
225 查看
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和 InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update
Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生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是否为空等。
More Detail:
http://www.qnr.cn/pc/erji/cpp/ziliao/200906/167797_2.html
相关文章推荐
- 系统何时发送WM_PAINT消息?
- SDK编程中有效区域与无效区域的盲区WM_PAINT消息何时发送的。。。
- SDK编程中有效区域与无效区域的盲区WM_PAINT消息何时发送的。。。
- SDK编程中有效区域与无效区域的盲区WM_PAINT消息何时发送的。。。
- 使用SendMessage方法对窗体上的控件进行截图,该方法的思想就是把控件的句柄拿到,对控件发送WM_PAINT消息,并且把希望得到图形对象的句柄当作wParam参数传过去,这样就可以在图形对象得到想要得图形。
- Invalidate(TRUE)与Invalidate(FALSE)区别(前者会发送WM_ERASEBKGND消息全部刷新,然后使用WM_PAINT消息绘制,而后者只发送WM_PAINT消息)
- mfc编程之发送wm_paint消息时绘图界面只出现一瞬间
- VC里OnPaint几点要注意的地方(没有invalidate,系统认为窗口没有更新的必要,于是就对发来的WM_PAINT消息不理不睬)
- DoModal 的调用会发送 WM_INITDIALOG 消息 WM_ERASEBKG 先于WM_PAINT
- Windows GUI WM_PAINT消息一直发送的问题
- Win32程序不停发送WM_PAINT消息
- WM_SYSCOMMAND消息(点击窗口的系统菜单发送的消息)
- [转]关于windows 的窗口消息和WM_PAINT
- TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)
- BroadcastReceiver 广播 系统全局的 消息发送及接收(未完成)
- 向系统发送英文汉字混合消息的函数void SendKeys(char * str)
- WM_PAINT消息详解
- 关于WM_PAINT消息
- 关于WM_PAINT消息中只重绘无效区的问题
- 开源一个Java Class实现Openfire登陆、推出、消息发送,方便其他系统集成IM功能了