0

我有一个相当简单的 Windows 程序,它创建了一个应该完全填充客户区的列表视图控件。这在启动时有效,我认为如果调整窗口大小会起作用——除了窗口永远不会收到任何 WM_SIZE 消息(在创建窗口时发送的初始消息之后)。我使用 Spy++x64 作为管理员验证了这一点确保我捕捉到了一切。Spy++ 显示窗口接收 WM_SIZING、WM_WINPOSCHANGED、WM_NCCALCSIZE 和 WM_WINPOSCHANGING(此列表没有任何特定顺序),但绝不是 WM_SIZE。

这是一个 64 位程序,但我不知道为什么这很重要。

那么,我可以做些什么来让窗口完全调整大小,但在发生这种情况时阻止 Windows 生成 WM_SIZE 消息?如果没有,我需要做些什么(过去 30 年来从未需要)让 Windows 知道我需要查看那些 WM_SIZE 事件?

4

1 回答 1

0

事实证明,默认窗口过程在处理 WM_WINDOWPOSCHANGED 时会生成 WM_SIZE,并且由于我正在处理 WM_WINDOWPOSCHANGED,因此没有创建大小消息。所以我将位置更改消息转发给默认处理程序,消息又回来了。

这遵循记录的行为。WM_WINDOWPOSCHANGED文档的文档中有一句话

默认情况下,DefWindowProc函数将WM_SIZEWM_MOVE消息发送到窗口。如果应用程序在没有调用的情况下处理消息,则不会发送WM_SIZE和消息。WM_MOVEWM_WINDOWPOSCHANGEDDefWindowProc在消息期间执行任何移动或大小更改处理WM_WINDOWPOSCHANGED而不调用DefWindowProc.

是的,我很遗憾地承认,当我需要了解 WM_SIZE 时,我没有阅读所有我没有遇到问题的 Window 消息的文档。愚蠢的我没有假设我需要的关于 WM_SIZE 的文档只能在其他一些消息下找到!WM_SIZE 文档中关于消息生成的所有内容是:

大小改变后发送到窗口。

根本没有提到对要找到不同消息的默认处理的任何依赖。因此,这种行为实际上是没有记录的,特别是因为它可能是关键信息,就像对我一样。

哦,好吧,我放弃了,这个地方已经变得太多了,只是因为提出一些人认为太容易回答的问题而让人们失望。试着记住,并不是每个人都有清晰的记忆力并且可以访问你已经记住的所有文档。我们中的一些人会查找我们正在处理的事情,并期望找到有关它的重要细节。他们不存在。再见!

于 2020-04-06T17:36:26.107 回答