`
tanzek
  • 浏览: 53010 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

VC++中的ON_COMMAND_RANGE宏

阅读更多
VC++中的ON_COMMAND_RANGE宏和ON_COMMAND等宏一样,是用来声明消息处理函数的,与
ON_COMMAND不同的是,此宏可用来定义一组消息的处理函数。

两个宏的用法是:
ON_COMMAND(id,memberFxn)
ON_COMMAND_RANGE(
id1,id2,memberFxn)

看起来其中memberFxn似乎没有什么差别,但是在学习使用中,发现ON_COMMAND_RANGE宏中的memberFxn常常会被定义成带参数的处理函数,而ON_COMMAND则是不带参数的处理函数。这就让我奇怪了,于是查阅MSDN的解释,循着提供的线索一直查到了《Visual C++ Programmer’s Guide》中的《Handlers for Message-Map Ranges》一章,于是在《Declaring the Handler Function》一节中找到了答案,引用原文如下:

Handler functions for single commands normally take no parameters. With the exception of update handler functions, handler functions for message-map ranges require an extra parameter, nID, of type UINT. This parameter is the first parameter. The extra parameter accommodates the extra command ID needed to specify which command the user actually chose. 

为了帮助和我一样不太懂英文的朋友,顶着头皮翻译了下:
单个命令(消息)的处理函数通常不带参数。但是更新处理函数、针对消息映射范围的处理函数需要一个额外的参数,一个UINT类型的nID。此参数是第一个参数,这个额外的参数收集了用来指定用户真正选择命令的命令ID。

因此完全可以一个带参数的消息处理函数来接收指定的命令ID,不过这里要提醒朋友一点的是,并不是非得只有一个参数,可以使用多个参数的消息处理函数,如function(WPARAM wParam, LPARAM lParam),但是真正能够使用的参数是第一个参数wParam,它是用户选择的命令ID。

对于更新处理函数,也存在相对应于ON_COMMAND_RANGE的ON_UPDATE_COMMAND_UI_RANGE宏,它的作用也是处理连续的范围(contiguous range),但是它与ON_COMMAND_RANGE有一点点区别。通过上面可知,一般范围处理函数(ON_COMMAND_RANGE)是通过在处理函数后面加一个参数,当消息进行处理时,将会把该命令ID传至该参数。而ON_UPDATE_COMMAND_UI_RANGE则使用的是pCmdUI,一个CCmdUI的指针类型,它内部就包含了一个数据成员(m_nID),用来指向命令ID,具体请参考MSDN中的内容。上述内容在MSDN中的《Visual C++ Programmer’s Guide》中的《Handlers for Message-Map Ranges》一章《Example for a Range of Command IDs》一节中可以找到原文:

Update handler functions for single commands normally take a single parameter, pCmdUI, of type CCmdUI*. Unlike handler functions, update handler functions for message-map ranges do not require an extra parameter, nID, of type UINT. The command ID, which is needed to specify which command the user actually chose, is found in the CCmdUI object.

意思大概也是:
单个命令的更新处理函数通常只带一个参数,即一个CCmdUI指针类型的pCmdUI。不像普通的处理函数一样,针对消息映射范围的更新处理函数不需要一个额外的UINT参数nID,这个用来指定用户真正选择的命令ID,能够在CCmdUI对象中找到。
分享到:
评论

相关推荐

    MFC动态创建控件+对话框滚动条

    使用ON_COMMAND_RANGE绑定控件事件 封装了三种创建控件 CreateDynControl(CTRLT_BUTTON,"我是按钮",10,20,100,40,NULL); CreateDynControl(CTRL_STATIC,"我是静态文本",150,20,100,45,NULL); CreateDynControl...

    VC++消息映射与处理\使用命令范围消息处理函数

    使用`ON_COMMAND_RANGE`宏,你可以指定开始ID和结束ID,以及对应的处理函数。例如: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_COMMAND_RANGE(IDC_CMD_START, IDC_CMD_END, OnCmdRange) END_MESSAGE_...

    vc++课程设计论文

    在实现文件`.cpp`中,用`BEGIN_MESSAGE_MAP`、`ON_COMMAND`等宏实际定义消息映射,如`ON_COMMAND(ID_APP_ABOUT, OnAppAbout)`映射`ID_APP_ABOUT`命令到`OnAppAbout`函数,最后以`END_MESSAGE_MAP`结束映射。...

    vc++与MFC菜单编程学习

    * 使用 ON_COMMAND_RANGE 宏定义命令范围的处理函数。 更新菜单项 ------------ MFC 中可以使用多种方式更新菜单项,包括: * 使用 CMenu::CheckMenuItem 函数更新菜单项的状态。 * 使用 ON_WM_INITMENUPOPUP ...

    VC++简单应用指南四-菜单共10页.pdf.zip

    为了响应用户的菜单选择,你需要在消息映射(message map)中定义ON_COMMAND或ON_COMMAND_RANGE宏,然后实现相应的成员函数来处理WM_COMMAND消息。 例如,如果你有一个菜单项ID_FILE_OPEN,你可能会在消息映射中...

    vc++菜单栏编程,关于各式菜单的创建

    在对应的CWinApp或CFrameWnd派生类中,通过`ON_COMMAND`或`ON_COMMAND_RANGE`宏定义消息映射,以便处理菜单项的点击事件。 6. **更新菜单状态**:根据程序的状态,你可能需要禁用某些菜单项或改变它们的外观。可以...

    VC++动态菜单设计

    在MFC中,这是通过在`.h`文件的`ON_COMMAND_RANGE`或`ON_COMMAND`宏中定义映射规则完成的。 5. **动态删除菜单项**: 当不再需要某个菜单项时,可以调用`CMenu::RemoveMenu`删除它。这可能发生在用户关闭某个功能或...

    VC++右键菜单

    在类的头文件中,添加ON_COMMAND_RANGE宏来处理一系列ID范围内的菜单项。例如,如果你的菜单项ID从ID_FILE_FIRST开始,你可以这样写: ```cpp BEGIN_MESSAGE_MAP(CMyView, CView) ON_COMMAND_RANGE(ID_FILE_FIRST,...

    windows程序设计实验指导书(2)MFC消息编程[收集].pdf

    6. **消息映射与处理函数**:使用Class Wizard添加菜单和工具条命令的`ON_COMMAND`和`ON_COMMAND_UI`消息映射,手工添加菜单子项的`ON_COMMAND_RANGE`和`ON_COMMAND_UI_RANGE`消息映射。例如,`OnButtonBlue()`函数...

    VC.rar_CView_vc 打印

    在上述代码中,`ON_COMMAND_RANGE` 指定了一组命令ID的范围,所有这些命令ID的消息都将被CMyShape的OnCommand方法处理。未被CMyShape处理的消息会被传递给基类CView,以保持原有的消息处理逻辑。 对于打印功能,...

    VC常用控件简介

    有时候,我们可能希望将多个控件的相同消息映射到同一个处理函数,这时可以使用ON_CONTROL_RANGE宏。这个宏允许指定一个消息码和一组连续的控件ID范围,以及处理函数名。ClassWizard不直接支持ON_CONTROL_RANGE,但...

    VC++在对话框中加载菜单

    为此,你需要覆盖 `OnCommand` 或 `ON_COMMAND_RANGE` 宏来处理特定的命令ID。 ```cpp void MyDialog::OnFileOpen() { // 处理打开文件的逻辑 } // 使用 ON_COMMAND_RANGE 可以处理一系列连续的命令ID BEGIN_...

    VC++2008树的实例开发

    同时,通过响应菜单项的命令消息,如ON_COMMAND_RANGE,可以执行相应的操作,如添加、删除或编辑节点。 在实际开发中,数据通常不直接绑定到树的节点上,而是通过自定义数据结构存储,然后用`SetItemData(HTREEITEM...

    vc一个制作菜单的例子

    为了让菜单项能够响应用户的点击,需要在消息映射(Message Map)中定义消息处理函数,并使用`ON_COMMAND`或`ON_COMMAND_RANGE`宏将菜单项的ID与处理函数关联起来。例如: ```cpp BEGIN_MESSAGE_MAP(MyClass, ...

    vc.rar_VC 单文档_single_vc document_动态菜单vc

    在`ON_COMMAND_RANGE`或`ON_UPDATE_COMMAND_UI`宏中添加对应菜单ID的映射,然后在对应的成员函数中实现具体操作。 5. **更新UI**:当状态改变需要更新菜单时,例如禁用或启用某个菜单项,可以使用`OnUpdateCmdUI()`...

    VC++ 2008 MFC简单作品(ribbon风格)

    例如,添加 ON_COMMAND_RANGE宏以处理特定范围的命令ID。 5. **实现功能**:最后,你需要在对应的类中实现与Ribbon元素关联的成员函数,完成实际的功能逻辑。 在提供的"Draw2008"项目中,我们可以看到一个简单的...

    vc++ADOX创建数据库

    // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX ); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { ...

    VC MFC在对话框中添加工具栏.rar

    这通常通过`ON_COMMAND_RANGE`宏实现,例如: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_COMMAND_RANGE(IDC_TOOLBAR_BUTTON1, IDC_TOOLBAR_BUTTON5, OnToolbarButton) END_MESSAGE_MAP() ``` 3. **实现...

    tab_Tabú_dealykb_Vc_

    例如,可以使用ON_COMMAND_RANGE宏定义一系列命令ID,然后在函数中根据实际发送的命令ID执行相应的操作。 6. 保持同步:当用户在Tab之间切换时,确保当前显示的ToolBar与选中的Tab页匹配。这可能需要在每次切换Tab...

    vc工具栏中实现下拉列表,并代有按钮

    可以重载"OnToolbarButton"函数来处理工具栏按钮的点击,而下拉列表的选择通常通过消息映射机制来处理,例如`ON_COMMAND_RANGE`或`ON_UPDATE_COMMAND_UI_RANGE`。 5. **扩展其他控件**: 如果需要在下拉列表中添加...

Global site tag (gtag.js) - Google Analytics