【问题标题】:Are WM_ERASEBKGND messages posted to the message queue?WM_ERASEBKGND 消息是否发布到消息队列?
【发布时间】:2015-10-13 18:23:37
【问题描述】:

WM_PAINT 消息不会发送到消息队列,而是当消息队列为空时,WM_PAINT 消息会发送到窗口过程(如果窗口的某些区域无效)。

但是,WM_ERASEBKGND 消息是以某种类似方式发送的,还是它们只是发布到消息队列中(documentation 对此不作任何说明)。

【问题讨论】:

  • 这不是 WM_PAINT 的工作原理。当队列为空时,它们不会被发送。当队列为空时,GetMessage 合成它们。
  • @David Heffernan 我不是说 "sent" 因为它是发送到消息队列,我说的是 "sent to the window procedure" i>,这意味着窗口过程被调用(我想是DispatchMessage())并传递WM_PAINT作为参数。我说的对吗?
  • 嗯,这也是排队消息在窗口过程中的结束方式。但是许多消息在没有通过消息循环和它对DispatchMessage 的调用的情况下到达窗口过程。 WM_PAINT 不同,它确实通过了消息循环,但实际上并没有发布到消息队列中。
  • @David Heffernan 是的,你是对的,这是我的理解。所以GetMessage()是从消息队列中检索消息的那个,如果它看到消息队列是空的并且窗口的某些区域是无效的,它用WM_PAINT消息填充MSG结构,然后DispatchMessage()照常调用窗口过程,对吗?
  • 为什么人们总是问这些问题?为什么这么重要?

标签: c winapi


【解决方案1】:

两者兼而有之,对于 Windows 消息来说并不少见。当程序执行像 UpdateWindow() 这样的命令或处理像 WM_SYSCOMMAND 这样移动或调整窗口大小的消息时,它将被发送。它会在程序调用 InvalidateRect() 时发布。

WM_PAINT 也是如此,通常是“已发布”消息,但仅在消息队列为空时由 GetMessage() 返回。但是,它会在您调用 UpdateWindow() 时发送,确保窗口在返回时被绘制。

不依赖这些实现细节非常重要。

【讨论】:

  • “不依赖这些实现细节非常重要” 你的意思是我应该假设在(不久的)将来的 Windows 版本中UpdateWindow() 不能调用窗口直接procedure,还是InvalidateRect()可以直接调用window procedure而不是等到代码执行返回到消息循环?
  • 我的意思是你没有一台时间机器可以回过头来了解消息是如何生成的。你只是不知道,它不一定是由你的流程或源代码中的代码完成的。
  • 哦,好吧!我感兴趣的是当我执行UpdateWindow() 之类的操作并且不知道收到的消息是如何生成的时会发生什么。
  • 你说WM_ERASEBKGND“当程序调用InvalidateRect()时它会被发布”,这是否意味着它会像大多数人一样发布到消息队列中其他消息(而不像WM_PAINT)?
  • 我不知道。像 WM_PAINT 那样合成的几率很高。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多