消息映射范围的处理程序

本文说明如何将消息映射范围。一个消息处理函数 (而不是映射到只有一个函数的消息)。

,当您需要处理多个消息或类似时,控件通知有时。 在此次,您可能希望所有消息映射到单个处理程序函数。 消息映射范围允许您执行此消息的一个连续范围的:

  • 可以映射命令 ID 的大小:

    • 命令处理程序函数。

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

  • 可以映射控件 ID 范围的控件通知在消息处理函数。

本文中包含的主题包括:

  • 编写消息映射项

  • 声明处理函数

  • 命令 ID 范围的示例

  • 控件 ID 范围的示例

编写消息映射项

,如下面的示例所示 .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);

单个命令的处理程序函数通常不采用参数。 除了更新处理程序函数以外,消息映射范围的处理程序函数需要一个额外的参数, nID,类型 UINT。 此参数是第一个参数。 多余的参数满足需要的多余的命令 ID 指定哪个命令用户实际上选择了。

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

命令 ID 范围的示例

何时可能使用范围? 一个示例在处理类似缩放的命令在 MFC 示例 HIERSVR。 此命令缩放视图,所以称之为介于 25% 和 300% 其正常大小之间。 HIERSVR 的视图类使用一个范围到缩放顺序与类似于的消息映射项的处理:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

当您编写消息映射项,指定:

  • 两个命令 ID、开头和结尾一个连续范围。

    在此处它们 ID_VIEW_ZOOM25 和 ID_VIEW_ZOOM300。

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

    在此处它 OnZoom。

函数声明将类似于以下内容:

public:
   afx_msg void OnZoom(UINT nID);

用例更新处理程序功能广泛风格和可能很有用。 它编写许多命令的 ON_UPDATE_COMMAND_UI 处理程序非常常见的并发现自己编写或复制,对于某代码。 解决方案将映射命令 ID 范围设置为一个更新处理程序函数使用 ON_UPDATE_COMMAND_UI_RANGE 宏。 命令 ID 必须构成一个连续范围。 有关示例,请参见 OnUpdateZoom 处理程序及其 ON_UPDATE_COMMAND_UI_RANGE 消息映射项在 HIERSVR 示例的视图类。

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

控件 ID 范围的示例

其他有趣的大小写映射控件 ID 范围的控件通知消息写入单个处理程序。 假设用户可以单击 10 个按钮中的任何一个。 若要映射全部 10 个按钮添加到处理程序中,您的消息映射项如下所示:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)    

当您编写在您的消息映射,您的 ON_CONTROL_RANGE 宏指定:

  • 特定控件通知消息。

    在此处它 BN_CLICKED

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

    在此处这些 IDC_BUTTON1 和 IDC_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 是这样。 然后可以采用按钮单击的一些其他操作。

请参见

概念

声明消息处理函数