你需要知道的:WM_WINDOWPOSCHANGED 的隐藏用法
在 WM_SHOWWINDOW 消息的文档中,如果你仔细研究的话,文档里会指出:WM_SHOWWINDOW 消息在某些特殊情况下不会发出。
问题来了,如果您希望在这些特殊情况下,仍然想知道窗口的可见状态,应该怎么做?
可以试试这个:WM_WINDOWPOSCHANGED 消息。
此消息是窗口状态变化流程的的最后一个消息。它结合了其他状态变化通知,例如 WM_MOVE,WM_SIZE 和 WM_SHOWWINDOW 等消息。但它不像 WM_SHOWWINDOW 那样受到同样的限制,因此您可以可靠地使用它来对显示或隐藏的窗口做出反应。
我们来看一个例子代码:
另外,请注意,如果不将 WM_WINDOWPOSCHANGED 消息传递给 DefWindowProc,则您将不会收到 WM_MOVE 或 WM_SIZE 消息,因为 DefWindowProc 将 WM_WINDOWPOSCHANGED 转换为 WM_MOVE 和 WM_SIZE 消息。
问题来了:”如果 WM_WINDOWPOSCHANGED 可以实现 WM_MOVE,WM_SIZE 和 WM_SHOWWINDOW 这些消息的功能,那这些消息不是多余的吗?那么为什么我们还要有其他信息呢?”
答案:直到 Windows 3.1 才引入了 WM_WINDOWPOSCHANGED 消息。在此之前,您别无选择,只能对其他消息做出反应。您现在可以将其他三条消息视为旧消息。他们没有错,但他们现在有点过时了。
我们会在后面的文章中来介绍下它的兄弟:WM_WINDOWPOSCHANGING 消息。
后记:今天这篇文章的的灵感,来自一个实际的客户问题,该问题是这样的:如果程序以 SW_SHOWMAXIMIZED 状态运行,则窗口将不会收到 WM_SHOWWINDOW 消息的情况。不幸的是,我在客户的问题中遗漏了一个细节,即他们需要知道何时显示窗口,因为应用程序初始化和窗口的可见状态高度关联。
应该注意的是,在显示窗口时进行应用程序初始化会显得非常奇怪。如果窗口从未显示怎么办?这是否意味着程序永远不会初始化自身?(例如,有人可能以 SW_HIDE 状态运行您的程序)。
WM_NCCREATE 和 WM_CREATE 是执行窗口初始化的更传统的地方。
总结
所以,你可以管中窥豹:Win32 的底层细节如此之多,值得我们花费人生的大段时间好好研究。
而我一直沉迷于开发 拓扑梅尔智慧办公平台 (Topomel Box) 的一个原因:我可以每天徜徉在 Win32 这个巨大的知识海洋中,每天都可以知道点新东西。
重要的是,这些底层知识可以帮助您更好的理解上层系统,且它们很难过时。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Use WM_WINDOWPOSCHANGED to react to window state changes》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关推荐
- 用户界面对象的线程亲缘性第一篇: 窗口
- Posted on 04月28日
- 隐藏在Windows中的罗夏测验
- Posted on 01月10日
- 傻傻分不清楚:WINVER,_WIN32_WINNT等
- Posted on 02月28日
- 错误信息:VS2010添加成员变量提示JS错误
- Posted on 11月22日
评论已关闭。