AFX_msg
消息映射机制是Windows编程的核心内容。Windows下的应用程序也都是通过消息驱动的机制来进行工作的。虽然VC开发环境自带了大量的系统消息处理函数,但我们实际的程序开发过程中总还是避免不了要写一些自定义的消息处理函数以满足所编写的软件功能的需要。那么在VC中如何定义自己的消息处理函数呢?其步骤如下:
1、在要定义消息映射函数的类的首部通过宏定义的方式定义一个用户类型的消息标识。定义方法如下:#define WM_USER1 WM_USER + 1 其中的WM_USER是系统定义好的用户类型的消息。只要以此为自定义消息的起点加上一个偏移量在0~0x3FFF之间的值,就不会和系统定义的其它消息发生冲突了。
2、在类上点击右键,然后在弹出的菜单中选择“添加成员函数”(Add member Function)。在弹出的添加函数对话框中的函数类型框中输入函数的类型。如:afx_msg LRESULT 消息处理函数一定要以afx_msg关键字开头,表明是全局函数。LRESULT是函数的类型。表明是系统回调函数。也可以是其它的类型。如int,void 等等合法的数据类型。在函数名称框中输入函数名。如:MyFunction(WPARAM wParam, LPARAM lParam),这两个参数是系统用于传递消息的附加参数。W开头的是十六位的信息参数。L开头的是三十二位的信息参数。
3、打开类的源文件。找到“BEGIN MESSAGE MAP” 和 "END MESSAGE MAP"。在两者之间声明消息与消息处理函数。如:ON_MESSAGE(WM_USER1, MyFunction).ON_MESSAGE是定义用户消息映射函数的系统函数。消息映射语句最好从 "//}}AFX_MSG_MAP"的下一行开始写起,因为它是系统维护自动生成代码的标记。如果写在它的上面,有可能会被删除。
4、在类的源文件中找到刚定义的消息函数,写入实现代码。
5、在需要调用消息映射函数的地方用SendMessage(WM_USER1);即可调用所定义的函数。WM_USER1 就是我们刚定义的消息名称
消息映射将处理函数与特定的消息、命令或通知关联。通过使用 ATL 的消息映射宏,可以为窗口指定消息映射。CWindowImpl、CDialogImpl 和 CContainedWindowT 中的窗口过程将窗口的消息定向到它的消息映射。
消息处理函数接受一个类型为 BOOL&
的附加参数。该参数指示是否已处理消息,默认情况下它被设置为 TRUE
。处理函数然后可以将该参数设置为 FALSE
以指示它尚未处理消息。这种情况下,ATL 将继续在消息映射中进一步查找处理函数。通过将该参数设置为 FALSE
,可以首先执行某个操作来响应消息,然后允许默认处理或其他处理函数完成消息的处理。
链接消息映射
ATL 还允许链接消息映射,就是将消息处理定向到另一个类中定义的消息映射。例如,可以在一个单独的类中实现一般消息处理,为与该类链接的所有窗口提供统一的行为。可以与基类或类的数据成员链接。
ATL 还支持动态链接,使您能够在运行时与其他对象的消息映射链接。若要实现动态链接,必须从 CDynamicChain 派生类。然后在消息映射中声明 CHAIN_MSG_MAP_DYNAMIC 宏。CHAIN_MSG_MAP_DYNAMIC 需要一个唯一数字来标识与之链接的对象和消息映射。必须通过 CDynamicChain::SetChainEntry 调用定义此唯一值。
可以与任何声明消息映射的类链接,只要它是从 CMessageMap 派生的。CMessageMap 允许对象向其他对象公开它的消息映射。注意,CWindowImpl 已从 CMessageMap 派生。
替换消息映射
最后,ATL 支持用 ALT_MSG_MAP 宏声明的替换消息映射。每个替换消息映射都由一个唯一数字标识,此数字由您传递给ALT_MSG_MAP。通过使用替换消息映射,可以在一个映射中处理多个窗口的消息。注意,默认情况下 CWindowImpl 不使用替换消息映射。若要添加此支持,请在 CWindowImpl 派生的类中重写 WindowProc 方法,并用消息映射标识符调用ProcessWindowMessage