天天看点

【MFC】MFC消息映射(二)

00. 目录

01. 概述

02. 消息映射宏

2.1 begin_message_map

2.2 declare_message_map

2.3 end_message_map

2.4 on_command

2.5 on_olecmd

03. 委托和接口映射宏

04. 使用消息映射交叉引用

05. 子窗口通知消息处理程序

06. wm_ 消息的处理程序

07. 用户定义的处理程序

08. 附录

引用的此部分列出了所有 消息映射宏 以及所有 cwnd 消息映射项以及相应的成员函数原型:

类别

描述

on _ 命令消息处理程序

处理 <code>wm_command</code> 由用户菜单选择或菜单访问键生成的消息。

子窗口通知消息处理程序

从子窗口处理通知消息。

wm_ 消息处理程序

处理 wm_ 消息,如 wm_paint 。

用户定义的消息处理程序

处理用户定义的消息。

由于 windows 是一种面向消息的操作系统,因此 windows 环境的大部分编程操作都涉及消息处理。 每次发生击键或鼠标单击事件时,都会将一条消息发送到应用程序,然后该应用程序必须处理该事件。

microsoft 基础类库提供了为基于消息的编程而优化的编程模型。 在此模型中,“消息映射” 用于指定哪些函数将处理特定类的各种消息。 消息映射包含一个或多个宏,这些宏指定哪些消息将由哪些功能处理。 例如,包含宏的消息映射 <code>on_command</code> 可能类似于:

<code>on_command</code>宏用于处理由菜单、按钮和快捷键生成的命令消息。 可以使用宏来映射以下内容:

windows 消息

控制通知

用户定义的消息

命令消息

已注册的用户定义消息

用户界面更新消息

消息范围

命令

更新处理程序消息

消息映射声明和分界宏

名称

declare_message_map

声明将在类中使用消息映射来将消息映射到函数(必须在类声明中使用)。

begin_message_map

开始消息映射的定义(必须在类实现中使用)。

begin_template_message_map

开始对包含单个模板参数的类类型的消息映射的定义。

end_message_map

结束消息映射的定义(必须在类实现中使用)。

消息映射宏

on_command

指示哪个函数将处理指定的命令消息。

on_command_ex

on_control

指示哪个函数将处理指定的控件通知消息。

on_message

指示哪个函数将处理用户定义的消息。

on_olecmd

指示哪个函数将处理 docobject 或其容器中的菜单命令。

on_registered_message

指示哪个函数将处理已注册的用户定义消息。

on_registered_thread_message

指示哪个函数将在您具有 cwinthread 类时处理已注册的用户定义消息。

on_thread_message

指示哪个函数将在您具有 cwinthread 类时处理用户定义的消息。

on_update_command_ui

指示哪个函数将处理指定的用户界面更新命令消息。

消息映射范围宏

on_command_range

指示哪个函数将处理在宏的前两个参数中指定的命令 id 的范围。

on_update_command_ui_range

指示哪个更新处理程序将处理在宏的前两个参数中指定的命令 id 的范围。

on_control_range

指示哪个函数将处理来自在宏的第二个和第三个参数中指定的控件 id 的范围的通知。 第一个参数是控件通知消息,如 bn_clicked。

常用说明

备注

在实现 ( .cpp) 文件中,该文件定义了类的成员函数,启动带有 begin_message_map 宏的消息映射,然后为每个消息处理函数添加宏项,并通过 end_message_map 宏完成消息映射。

声明类定义消息映射。 <code>ccmdtarget</code>程序中的每个派生类必须提供消息映射来处理消息。

在类声明的末尾使用 declare_message_map 宏。 然后,在定义类的成员函数的 .cpp 文件中,使用 begin_message_map 宏、每个消息处理函数的宏项和 end_message_map 的宏。
如果在 declare_message_map 后声明任何成员,则必须为它们指定新的访问类型 (<code>public</code> 、 <code>private</code> 或 <code>protected</code>) 。

示例

结束消息映射的定义。

此宏将命令消息映射到成员函数。

参考示例

它指示哪个函数将处理命令用户界面对象(如菜单项或工具栏按钮)的命令消息。 当命令目标对象收到具有指定 id 的 windows wm_command 消息时,on_command 将调用成员函数 <code>memberfxn</code> 来处理该消息。 使用 on_command 将单个命令映射到成员函数。 使用 on_command_range 将一系列命令 id 映射到一个成员函数。 只有一个消息映射项可以匹配给定的命令 id。 也就是说,不能将命令映射到多个处理程序。 有关详细信息和示例,请参阅 消息处理和映射主题。

通过命令调度接口路由命令 <code>iolecommandtarget</code> 。

<code>iolecommandtarget</code> 允许容器接收源自 docobject 的用户界面的命令,并允许容器在 “文件” 菜单上发送相同的 (命令,如 “新建”、“打开”、“另存” 和 “打印”。以及复制、粘贴、撤消等操作,请在 “编辑” 菜单中) docobject。 <code>iolecommandtarget</code> 比 ole 自动化的更简单 <code>idispatch</code> 。 <code>iolecommandtarget</code> 完全依赖于一组标准的命令,这些命令很少包含参数,并且不涉及任何类型信息 (命令参数的类型安全降低) 。 如果确实需要调度带有参数的命令,请使用 coleserverdoc:: onexecolecmd。 <code>iolecommandtarget</code>标准菜单命令已由 mfc 在下列宏中实现: on_olecmd_clearselection ( ) 调度 “编辑清除” 命令。 实现方式:

on_olecmd_copy ( ) 调度编辑复制命令。 实现方式:

on_olecmd_cut ( ) 调度 “编辑剪切” 命令。 实现方式:

on_olecmd_new ( ) 调度 file new 命令。 实现方式:

on_olecmd_open ( ) 调度文件打开命令。 实现方式:

on_olecmd_pagesetup ( ) 调度文件页面设置命令。 实现方式:

on_olecmd_paste ( ) 调度 “编辑粘贴” 命令。 实现方式:

on_olecmd_pastespecial ( ) 调度 “编辑” “选择性粘贴” 命令。 实现方式:

on_olecmd_print ( ) 调度文件打印命令。 实现方式:

on_olecmd_printpreview ( ) 调度文件 “打印预览” 命令。 实现方式:

on_olecmd_redo ( ) 调度编辑重做命令。 实现方式:

on_olecmd_save ( ) 调度文件保存命令。 实现方式:

on_olecmd_save_as ( ) 调度文件的 “另存为” 命令。 实现方式:

on_olecmd_save_copy_as ( ) 调度 “文件另存为” 命令。 实现方式:

on_olecmd_selectall ( ) 调度 “编辑全部选择” 命令。 实现方式:

on_olecmd_undo ( ) 调度 “编辑” 撤消命令。 实现方式:

mfc 为委托和接口映射支持以下宏:

begin_delegate_map

开始一个委托映射。

begin_interface_map

开始接口映射的定义。

commandhandler 委托

向命令源注册回调方法。

end_delegate_map

结束委托映射。

end_interface_map

终止实现文件中的接口映射。

event_delegate_entry

在委托映射中创建条目。

interface_part

用于 begin_interface_map 宏与对象将支持的每个接口的 end_interface_map 宏。

make_delegate

将事件处理程序附加到托管控件。

在标记为的项中 ,为派生的 cwnd 类编写你自己的成员函数。 将函数命名为您喜欢的任何名称。 其他函数,如 <code>onactivate</code>,是 <code>cwnd</code> 类的成员函数。 如果调用这些函数,则会传递消息给 <code>defwindowproc</code> windows 函数。 要处理 windows 通知消息,请重写派生类中相应的 <code>cwnd</code> 函数。 您的函数应调用基类中的重写函数使基类和 windows 响应消息。

在所有情况下,请将函数原型放在 <code>cwnd</code> 派生的类标头中,并对消息映射条目进行编码,如下所示。

使用了以下术语:

术语

定义

id

任何用户定义的菜单项 id(wm_command 消息)或控件 id(子窗口通知消息)。

“message”和“wnotifycode”

在 windows.h 中定义的 windows 消息 id。

nmessagevariable

包含 windows 函数返回值的变量的名称 <code>registerwindowmessage</code> 。

有五种类别的子窗口通知消息:

泛型控件处理程序

泛型控件通知代码的处理程序。

用户按钮处理程序

用户按钮通知代码的处理程序。

组合框处理程序

组合框通知代码的处理程序。

编辑控件处理程序

编辑控件通知代码的处理程序。

列表框处理程序

列表框通知代码的处理程序。

以下主题对应于映射条目。

主题

映射条目

a - c

通过 on_wm_ctlcolor on_wm_activate

d - e

通过 on_wm_erasebkgnd on_wm_deadchar

f - k

通过 on_wm_killfocus on_wm_fontchange

l - m

通过 on_wm_moving on_wm_lbuttondblclk

n - o

通过 on_wm_ncrbuttonup on_wm_ncactivate

p - r

通过 on_wm_renderformat on_wm_paint

s

通过 on_wm_syskeyup on_wm_setcursor

t - z

通过 on_wm_wininichange on_wm_timechange

以下映射项对应于函数原型。

函数原型

on_message ( , )

afx_msg lresult memberfxn ( wparam,lparam ) ;

on_registered_message ( , )

on_thread_message ( , )

afx_msg void memberfxn ( wparam、lparam ) ;

on_registered_thread_message ( , )

继续阅读