WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式,效率更高,灵活性更强)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式,效率更高,灵活性更强)相关的知识,希望对你有一定的参考价值。

Q:wm_paint消息在窗口重绘的时候产生,那什么时候窗口会重绘??

A:

严格地说,只有当收到WM_PAINT消息后窗口会重绘
但是引起这个消息的事件有很多,
比如:

首次创建
移动
改变大小

showwindow/ activate window/ invalidate window 。。。。

 

系统为什么不在调用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是否为空等。

http://baike.baidu.com/view/1988590.htm

以上是关于WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式,效率更高,灵活性更强)的主要内容,如果未能解决你的问题,请参考以下文章

emWin使用遇到的问题以及解决办法

C语言消息处理的问题,WM_PAINT自动关闭窗口

mfc中,我想把自己的图片显示在窗口中,一定要在wm_paint重绘中实现??

WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)

窗口绘制

windows api 文本输出