【发布时间】:2015-12-23 01:31:54
【问题描述】:
当WM_SIZE 和WM_PAINT 消息都发送时(例如:当我将窗口调整为更大尺寸时),是否保证WM_SIZE 消息将在WM_PAINT 消息之前发送?
【问题讨论】:
当WM_SIZE 和WM_PAINT 消息都发送时(例如:当我将窗口调整为更大尺寸时),是否保证WM_SIZE 消息将在WM_PAINT 消息之前发送?
【问题讨论】:
是的,首先收到WM_SIZE,然后WM_PAINT会以新大小发送。
实际上,WM_PAINT 是一个 lazy 消息(另一个是 WM_TIMER,IIRC):它实际上并没有发送到消息队列。相反,当窗口无效时,会设置一个标志,当您调用GetMessage() 并且队列中没有剩余消息时,它会检查无效标志。如果设置了,它将返回一个捏造的WM_PAINT 消息。
这具有WM_PAINT 具有低优先级的效果,并在一次重绘中有效地融合了所有待处理的无效。
【讨论】:
WM_PAINT通常是您描述的合成消息。但是,UpdateWindow() 和RedrawWindow(RDW_UPDATENOW) 会生成一个真实的WM_PAINT 消息,该消息会立即直接发送到窗口,绕过消息队列。窗口不会知道其中的区别,它只会在被告知绘画时进行绘画。