我有一个相当简单的windows程序,它创建了一个列表视图控件,该控件应该完全填充客户端区域。这在启动时有效,我认为如果调整窗口大小也会有效——除了窗口从未收到任何WM_SIZE消息(在创建窗口时发送的第一条消息之后(。我作为管理员使用Spy++x64验证了这一点,以确保我捕获了所有信息。Spy++显示窗口接收WM_SIZING、WM_WINPOSCHANGED、WM_NCCALCSIZE和WM_WINPOS CHANGING(此列表没有任何特定顺序(,但从不接收WM_SIZE。
这是一个64位程序,但我不知道为什么这很重要。
那么,我本可以做些什么来允许窗口完全调整大小,但防止Windows在这种情况下生成WM_SIZE消息吗?如果没有,我是否需要做一些事情(在过去30年中从未需要过(,让Windows知道我需要查看那些WM_SIZE事件?
事实证明,默认窗口过程在处理WM_WINDOWPOSCHANGED时生成WM_SIZE,并且由于我处理的是WM_WINDOVPOSCHANGed,因此没有创建大小消息。因此,我将位置更改的消息转发到默认处理程序,消息就返回了。
这遵循了记录在案的行为。WM_WINDOWPOSCHANGED文档中有一条注释:
默认情况下,DefWindowProc函数会向窗口发送WM_SIZE和WM_MOVE消息如果应用程序处理
WM_WINDOWPOSCHANGED
消息而不调用DefWindowProc
,则不发送WM_SIZE
和WM_MOVE
消息在不调用DefWindowProc
的情况下,在WM_WINDOWPOSCHANGED
消息期间执行任何移动或大小更改处理更有效。
是的,我很抱歉承认,当我需要了解WM_SIZE时,我没有阅读所有窗口消息的文档。愚蠢的我没有假设我需要的关于WM_SIZE的文档只是在其他消息下找到的!它在WM_SIZE文档中所说的关于消息生成的内容是:
在窗口大小更改后发送到窗口。
根本没有提到要找到的不同消息对默认处理的任何依赖性。呃,这种行为实际上是没有记录的,尤其是因为它可能是关键信息,就像对我来说一样
哦,好吧,我放弃了,这个地方已经变得太多了,因为人们提出了一些人们认为太容易回答的问题,而只是对他们进行抨击。试着记住,并不是每个人都有一个完整的记忆,并且可以访问所有你记忆的文档。我们中的一些人查找我们正在处理的事情,并期望找到有关它的重要细节。它们并不存在。再见