有些人对术语 WM_USER 表示消息范围基的名称有不同的意见,因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是,用户不能使用它们,因为它们属于窗口类定义的一部分。
但是,问题是,”这里的用户是谁?” 换句话说,当我们说”用户自定义”这个词的时候,做自定义操作的这个用户到底是指谁?
在上面这个问题中,总共有四个不同的组件涉及其中,每个组件都有它自己的消息范围。
> 窗口管理器处理 WM_USER 之下的消息。
> 窗口类的实现者处理 WM_USER 到 WM_APP – 1 之间的消息。
> 应用程序(具体来说,就是创建窗口的代码)处理 WM_APP 到 MAXINTATOM – 1 之间的消息。
> 所有其他组件通过 RegisterWindowMessage 处理 MAXINTATOM 到 MAXWORD 之间的消息。
用户是谁?这取决于你是站在哪个角度来如何理解这个问题的。
从窗口管理器的角度来看,窗口类的实现者是用户,因为窗口类的代码会调用窗口管理器。
从窗口类的实现者的角度来看,应用程序是用户,因为它调用了窗口类。
那如果从应用程序的角度来看,所有的外部代码就是用户了,因为外部代码会调用应用程序。
相反,你可以“向上”查找列表,并观察到从每个组件的角度来看,属于其上方组件的消息是“保留”的。
从类实现者的角度来看,窗口管理器消息是保留的。从应用程序的角度来看,类实现者的消息是保留的。从所有外部程序的角度来看,应用程序的消息是保留的。
让我们来看看下图,帮助理解。
>> 请移步至 topomel.com 以查看图片 <<
每个框将属于其内框的消息视为保留;相反,每个内框将下一个外框视为其“用户”。
由于 winuser.h 头文件是由窗口管理器团队编写的,因此他们从窗口管理器的角度看世界也就不足为奇了。因此,窗口管理器外部的所有内容都是“用户定义的”,窗口管理器内部的所有内容都是“保留的”。
当然,如果从类实现者的角度来看,那么“保留”和“用户”这两个词的上下文就会发生变化。例如,你可以在对话框常量 DWLP_USER 中看到这一点,该常量是对话框的“用户”可以使用的窗口字节的索引;即,通过应用程序的对话过程。
总结
简化一个复杂的问题,可以通过划分层次的思路来将其分成一个一个的小问题。
人生也是如此。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《When something is available for the user, which user are we talking about?》