当调整窗口大小时,没有收到 WM_SIZE 消息

3
我有一个非常简单的Windows程序,创建了一个列表视图控件,应该完全填充客户端区域。这在启动时有效,我认为如果窗口调整大小,它也会有效 - 但是窗口永远不会收到任何WM_SIZE消息(除了在窗口创建时发送的初始消息)。我使用管理员身份验证了这一点,确保我捕获了所有内容。Spy++显示窗口接收到WM_SIZING、WM_WINPOSCHANGED、WM_NCCALCSIZE和WM_WINPOSCHANGING(此列表没有特定的顺序),但从未收到WM_SIZE消息。
这是一个64位程序,但我不知道这是否有影响。
那么,我是否可能会做了什么使窗口可以完全调整大小,但同时又防止Windows在发生调整时生成WM_SIZE消息?如果不是,那么是否需要执行某些操作(过去30年从未需要过)来让Windows知道我需要看到这些WM_SIZE事件?
1个回答

2
原来默认的窗口程序在处理WM_WINDOWPOSCHANGED时会生成WM_SIZE,由于我正在处理WM_WINDOWPOSCHANGED,所以没有创建大小消息。因此,我将位置更改消息转发到默认处理程序,然后消息就回来了。
这符合文档中的行为。在WM_WINDOWPOSCHANGED文档中有一个备注
默认情况下,DefWindowProc 函数会向窗口发送 WM_SIZEWM_MOVE 消息。如果应用程序处理了 WM_WINDOWPOSCHANGED 消息并且没有调用 DefWindowProc 函数,则不会发送 WM_SIZEWM_MOVE 消息。在处理 WM_WINDOWPOSCHANGED 消息时,不调用 DefWindowProc 更加高效,可以进行任何移动或大小改变的处理。

是的,我很抱歉承认,在需要了解WM_SIZE时,我未能阅读与我没有问题的所有窗口消息的文档。傻瓜我,没有假设我需要关于WM_SIZE的文档只能在其他消息下找到! WM_SIZE文档中关于消息生成的所有内容都是:

窗口大小更改后发送给窗口。

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

哦,好吧,我放弃了,这个地方已经变得太多了,只是因为有些人认为问题太容易回答而打击人们。请记住,并非每个人都具有完美的记忆和您所掌握的所有文档的访问权限。我们中的一些人查找我们正在处理的事物并期望找到有关其重要细节的信息。它们不存在。再见!


1
【WM_WINDOWPOSCHANGED】默认情况下,DefWindowProc 函数会向窗口发送 WM_SIZE 和 WM_MOVE 消息。如果应用程序处理了 WM_WINDOWPOSCHANGED 消息而没有调用 DefWindowProc,则不会发送 WM_SIZE 和 WM_MOVE 消息。 - IInspectable
@Steve Valliere:Inspectable是第一个,但这是有文档记录的行为。 - user2120666
@IInspectable:我不同意你的观点,OP指责微软没有记录这种行为,但实际上是有记录的。所以我会给他点个踩。这个回答有什么帮助吗?我不理解。 - user2120666
2
@use: 这种情况已经不再存在了。一旦贡献被编辑过,您可以取消对其的踩票。 - IInspectable
1
@IInspectable:不。如果用户不想阅读文档,就不配获得取消点赞的机会。这就像:“我停止了我的电锯,但没看说明书。现在我的手没了,我才阅读这本手册。请取消对我点赞。” - user2120666
就我所知,我正在查看微软的在线文档,他们已经对其进行了修订,使得这些消息现在彼此相互引用,而不是在WM_SIZE和WM_MOVE消息文档中根本没有提到WM_WINDOWPOSCHANGED。 - Steve Valliere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接