MFC批处理控件的消息函数

Visual C++ 概念:添加功能

消息映射范围的处理程序

本文解释如何将某个消息范围映射到单个消息处理函数(而不是将一条消息只映射到一个函数)。

有时需要以相同的方法处理一条以上的消息或控件通知。这时可能希望将所有消息映射到一个处理函数。可以使用消息映射范围为连续范围的消息进行这种处理:

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

·         一个命令处理函数。

·         一个命令更新处理函数。

  • 可以将某个控件 ID 范围的控件通知消息映射到一个消息处理函数。

本文涉及的主题包括:

编写消息映射项

.CPP 文件中添加消息映射项,如下例所示:

复制代码

...

BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

    ...

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, OnDoSomething)

END_MESSAGE_MAP( )

...

消息映射项包括下列几项:

  • 消息映射范围宏:

·         ON_COMMAND_RANGE

·         ON_UPDATE_COMMAND_UI_RANGE

·         ON_CONTROL_RANGE

  • 该宏的参数:

前两个宏采用三个参数:

·         范围起始的命令 ID

·         范围结束的命令 ID

·         消息处理函数名

命令 ID 的范围必须是连续的。

第三个宏 ON_CONTROL_RANGE 采用额外的第一个参数:控件通知消息,例如 EN_CHANGE

声明处理函数

.H 文件中添加处理函数声明。下列代码显示如何声明,见下例的倒数第二行所示:

复制代码

// Generated message-map functions

protected:

        ...

    afx_msg void OnDoSomething( UINT nID );

    DECLARE_MESSAGE_MAP()

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

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

命令 ID 范围示例

何时可以使用范围?一个示例是在 MFC 示例 HIERSVR 中处理缩放这样的命令时。该命令在视图正常大小的 25% 300% 之间进行缩放。HIERSVR 的视图类使用一个范围,通过类似于下面这样的消息映射项来处理缩放命令:

复制代码

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, OnZoom)

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

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

此处,这两个命令 ID ID_VIEW_ZOOM25 ID_VIEW_ZOOM300

  • 命令的处理函数名。

此处,该处理函数名是 OnZoom

函数声明类似于:

复制代码

afx_msg void OnZoom(UINT nID);

更新处理函数的情况与此类似,并可能具有更广泛的用途。编写若干命令的 ON_UPDATE_COMMAND_UI 处理程序并发现自己正在反复编写或复制相同的代码,这种情况相当普遍。解决方案是使用 ON_UPDATE_COMMAND_UI_RANGE 宏将一个命令 ID 的范围映射到一个更新处理函数。该命令 ID 必须构成一个连续的范围。有关示例,请参见 HIERSVR 示例的视图类的 OnUpdateZoom 处理程序及其 ON_UPDATE_COMMAND_UI_RANGE 消息映射项。

通常,单个命令的更新处理函数采用 CCmdUI* 类型的单个参数 pCmdUI。与处理函数不同,消息映射范围的更新处理函数不需要 UINT 类型的额外参数 nID。指定用户实际选择的命令所需的命令 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 CMyDialog::OnButtonClicked( UINT nID )

{

    int nButton = nID - IDC_BUTTON1;

    ASSERT( nButton >= 0 && nButton < 10 );

    // ...

}

单个 BN_CLICKED 消息的 OnButtonClicked 处理函数不采用参数。一个范围的按钮的同一个处理函数采用一个 UINT 参数。这个额外的参数可以标识负责生成 BN_CLICKED 消息的特定控件。

示例中显示了典型的代码:将传递的值转换为消息范围内的 int 并断言确实是这样。然后您可以根据所单击的按钮执行某个不同的操作。

请参见

声明消息处理函数

个人信息中心 | 法律信息 | MSDN Flash 中心 | 联系我们

© 2009 Microsoft Corporation 版权所有。 保留所有权利  |  商标  |  隐私权声明

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值