OnBarCheck ON_COMMAND_EX

 

 

CFrameWnd提供了OnBarCheck来响应与ID_VIEW_STATUS_BAR、ID_VIEW_TOOLBAR菜单项对应的命令。
消息映射:
ON_COMMAND_EX(ID_VIEW_STATUS_BAR,   OnBarCheck)
ON_COMMAND_EX(ID_VIEW_TOOLBAR,   OnBarCheck)
这里,使用了扩展命令消息映射宏把ID_VIEW_STATUS_BAR和ID_VIEW_TOOLBAR命令映射给同一个函数OnBarCheck处理。
OnBarCheck函数的实现:
BOOL CFrameWnd::OnBarCheck(UINT   nID)
{
    ASSERT(ID_VIEW_STATUS_BAR   ==   AFX_IDW_STATUS_BAR);
    ASSERT(ID_VIEW_TOOLBAR   ==   AFX_IDW_TOOLBAR);
    //得到工具条或者状态条
    CControlBar*   pBar   =   GetControlBar(nID);
    if   (pBar   !=   NULL)
    {
        //若控制条可见,则隐藏它;否则,显示它
        ShowControlBar(pBar,   (pBar-> GetStyle()   &   WS_VISIBLE)   ==   0,   FALSE);
        //处理完毕
        return   TRUE;
    }
    //可以让下一个命令目标继续处理
    return   FALSE;
}

由于是扩展映射宏定义的消息处理函数,所以OnBarCheck函数有一个UINT类型的参数和一个BOOL返回值。
当用户从“View”菜单选择打了钩的“Toolbar”时,消息处理函数OnBarCheck被调用,参数就是菜单项的ID号ID_VIEW_TOOLBAR,
它等于工具条的子窗口IDAFX_IDW_TOOLBAR。处理结果,工具条被隐藏;当再次选择该菜单项则工具条被显示。
处理状态条的过程类似于工具条的处理。

 

 http://www.vczx.com/tutorial/mfc/mfc13.php

 

 

 

扩展映射宏和对应的普通映射宏的参数个数相同,含义一样。

但是扩展映射宏的消息处理函数的原型和对应的普通映射宏相比,有两个不同之处:

一是多了一个UINT类型的参数,另外就是有返回值(返回BOOL类型)。

回顾4.4.2章节,范围映射宏ON_COMMAND_RANGE的消息处理函数也有一个这样的参数,该参数在两处的含义是一样的,

即:1、命令消息扩展映射宏ON_COMMAND_EX定义的消息处理函数解释该参数是当前要处理的命令消息ID。

2、有返回值的意义在于:如果扩展映射宏的消息处理函数返回FALSE,则导致当前消息被发送给消息路径上的下一个消息目标处理。

综合来看,ON_COMMAND_EX宏有两个功能:

一是可以把多个命令消息指定给一个消息处理函数处理。这类似于ON_COMMAND_RANGE宏的作用。不过,这里的多条消息的命令ID或者控制子窗口ID可以不连续每条消息都需要一个ON_COMMAND_EX宏。

二是可以让几个消息目标处理同一个命令或者通知或者反射消息。如果消息发送路径上较前的命令目标不处理消息或者处理消息后返回FALSE,则下一个命令目标将继续处理该消息。

对于通知消息、反射消息,它们也有扩展映射宏,而且上述论断也适合于它们。例如:

ON_NOTIFY对应的ON_NOTIFY_EX

ON_CONTROL对应的ON_CONTROL_EX

ON_CONTROL_REFLECT对应的ON_CONTROL_REFLECT_EX

等等。

范围消息映射宏也有对应的扩展映射宏,例如:

ON_NOTIFY_RANGE对应的ON_NOTIFY_EX_RANGE

ON_COMMAND_RANGE对应的ON_COMMAND_EX_RANGE

使用这些宏的目的在于利用扩展宏的第二个功能:实现消息的多次处理。

 

 http://st251256589.blog.163.com/blog/static/164876449201132604445394/

### ON_COMMAND 含义及用法 `ON_COMMAND` 是一种宏,在 Windows 编程以及 MFC (Microsoft Foundation Classes) 中用于消息映射机制。此宏允许开发者将特定的消息或事件与类成员函数关联起来,使得当指定的命令消息发生时能够调用相应的处理函数。 在MFC应用程序框架内,为了响应菜单项点击、按钮按下等产生的WM_COMMAND消息,通常会在派生自CWinApp、CFrameWnd或其他窗口基类中的子类里利用 `BEGIN_MESSAGE_MAP` 和 `END_MESSAGE_MAP` 宏定义一段消息映射表,并在此之间加入像 `ON_COMMAND` 这样的条目来指明哪些消息应该由哪个成员函数负责处理[^2]。 例如: ```cpp BEGIN_MESSAGE_MAP(CMyClass, CBaseClass) ON_COMMAND(ID_FILE_NEW, &CMyClass::OnFileNew) // Other message map entries... END_MESSAGE_MAP() ``` 上述代码片段表示如果收到ID为`ID_FILE_NEW` 的 WM_COMMAND 消息,则应调用 `CMyClass::OnFileNew()` 方法来进行相应处理。 ### 与其他类似命令对比 #### ON_UPDATE_COMMAND_UI vs ON_COMMAND - **用途不同**:`ON_UPDATE_COMMAND_UI` 主要用来更新用户界面上控件的状态(如启用状态、选中标记)。而 `ON_COMMAND` 则是用来执行实际的功能逻辑。 - **参数差异**: 使用 `ON_UPDATE_COMMAND_UI` 需要提供指向 `CCmdUI` 类型的对象指针作为参数传递给回调方法;相反地,`ON_COMMAND` 不需要额外参数即可完成任务绑定。 #### ON_NOTIFY vs ON_COMMAND - **触发源区别**: `ON_NOTIFY` 处理来自子窗口的通知消息,适用于对话框内的控件通知,比如列表框的选择变化、滚动条位置改变等情况。相比之下,`ON_COMMAND` 更多关注于顶层窗口级别的命令操作,像是文件打开保存之类的全局行为。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值