Message-Map 范围的处理程序

本文介绍如何将一系列消息映射到单个消息处理程序函数(而不是将一条消息映射到一个函数)。

有时需要以完全相同的方式处理多个消息或控制通知。 在这种情况下,你可能希望将所有消息映射到单个处理程序函数。 通过消息映射范围,可以针对连续的消息范围执行此作:

  • 可以将命令 ID 的范围映射到:

    • 命令处理程序函数。

    • 命令更新处理程序函数。

  • 可以将一系列控件 ID 的控制通知消息映射到消息处理程序函数。

本文中介绍的主题包括:

编写 Message-Map 条目

在。CPP 文件,添加消息映射条目,如以下示例所示:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

消息映射条目包含以下项:

  • 消息映射范围宏:

  • 宏的参数:

    前两个宏采用三个参数:

    • 启动范围的命令 ID

    • 结束范围的命令 ID

    • 消息处理程序函数的名称

    命令 ID 的范围必须连续。

    第三个宏 ON_CONTROL_RANGE采用其他第一个参数:控件通知消息,如 EN_CHANGE

声明处理程序函数

在 . 中添加处理程序函数声明。H 文件。 以下代码显示了其外观,如下所示:

public:
   afx_msg void OnDoSomething(UINT nID);

单个命令的处理程序函数通常不采用任何参数。 除了更新处理程序函数之外,消息映射范围的处理程序函数需要 UINT 类型的额外参数 nID。 此参数是第一个参数。 额外参数容纳指定用户实际选择的命令所需的额外命令 ID。

有关更新处理程序函数的参数要求的详细信息,请参阅 命令 ID 范围的示例

命令 ID 范围的示例

使用范围时,一个示例是在处理 MFC 示例 HIERSVR 中的 Zoom 命令等命令。 此命令缩放视图,将其缩放为正常大小的 25% 到 300%。 HIERSVR 的视图类使用范围来处理 Zoom 命令,其消息映射条目类似于:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

编写消息映射条目时,请指定:

  • 两个命令 ID,开始和结束连续范围。

    在这里,他们 ID_VIEW_ZOOM25ID_VIEW_ZOOM300

  • 命令的处理程序函数的名称。

    这里就是 OnZoom

函数声明类似于:

public:
   afx_msg void OnZoom(UINT nID);

更新处理程序函数的情况类似,并且可能更有用。 编写大量命令的处理程序并发现自己在一段时间内编写或复制相同的代码是很常见的 ON_UPDATE_COMMAND_UI 。 解决方案是使用 ON_UPDATE_COMMAND_UI_RANGE 宏将一系列命令 ID 映射到一个更新处理程序函数。 命令 ID 必须形成连续的范围。 有关示例,请参阅 OnUpdateZoom HIERSVR 示例视图类中的处理程序及其 ON_UPDATE_COMMAND_UI_RANGE 消息映射条目。

单个命令的更新处理程序函数通常采用类型CCmdUI*pCmdUI 的单个参数。 与处理程序函数不同,消息映射范围的更新处理程序函数不需要 UINT 类型的额外参数 nID。 在对象中找到 CCmdUI 指定用户实际选择的命令所需的命令 ID。

控件 ID 范围的示例

另一个有趣的情况是将一系列控件 ID 的控制通知消息映射到单个处理程序。 假设用户可以单击 10 个按钮中的任何一个。 若要将所有 10 个按钮映射到一个处理程序,消息映射条目如下所示:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

在消息映射中编写 ON_CONTROL_RANGE 宏时,请指定:

  • 特定的控件通知消息。

    这里 BN_CLICKED

  • 与连续控件范围关联的控件 ID 值。

    下面是 IDC_BUTTON1IDC_BUTTON10

  • 消息处理程序函数的名称。

    这里就是 OnButtonClicked

编写处理程序函数时,请指定额外的 UINT 参数,如下所示:

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

单个BN_CLICKED消息的OnButtonClicked处理程序不采用任何参数。 一系列按钮的同一处理程序采用一个 UINT。 额外的参数允许标识负责生成 BN_CLICKED 消息的特定控件。

示例中所示的代码是典型的:将传递给消息范围内的值并 int 断言这是这种情况。 然后,可能会执行一些不同的作,具体取决于单击了哪个按钮。

另请参阅

声明消息处理程序函数