`
beckshanling
  • 浏览: 264714 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系

    博客分类:
  • C++
阅读更多

ON_COMMAND是菜单和工具栏项处理消息的宏
ON_MESSAGE是处理自定义消息的宏

ON_NOTIFY 是控件向其父窗口发送消息处理的宏

 

对这几个消息的理解要先了解一下Window消息的背景。
在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中。由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以Windows3.1中定义了许多其它的 消息种类,比如WM_VSCROLL, WM_CTLCOLOR等等,每种消息wParam,lParam中附带的信息是不同的。
当到了Win32后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在Win32中定义了唯一一个强大的消息 WM_NOTIFY。当然WM_NOTIFY也遵守原来的消息规则,既只带参数wParam和lParam。唯一不同处在于,此时的lParam中传送的 是一个NMHDR指针。不同的控件可以按照规则对NMHDR进行扩充,因此WM_NOTIFY消息传送的信息量可以相当的大,这个可以看看MSDN中的相 关说明,TreeControl中就有很多这种消息。

现在就可以知道为什么有ON_MESSAGE ,ON_COMMAND, , ON_NOTIFY了。
ON_MESSAGE是处理所有的Windows的消息的,因为所有的消息都以相同的格式传送,也就是ID, WPARAM, LPARAM.
ON_COMMAND是专门处理WM_COMMAND消息的,这样我们就不用自己解开WM_COMMAND中wParam和lParam中传送的控件ID, 事件种类…(所有的都在MFC内部解决了:),当然方便了。
ON_NOTIFY更是不用说了,看看他的处理函数,是不是把NMHDR解出来了。

这样一样就一目了然了,ON_COMMAND和ON_NOTIFY都可以用ON_MESSAGE来处理,只不过自己要多做很多事情。ON_COMMAND和ON_NOTIFY最好就不要互换了!

 


几点说明:

1、ON_COMMAND(id,memberFxn)
此宏通过ClassWizard或手工插入一个消息映射。它表明那个函数将从一个命令用户接口(例如一个菜单项或toolbar按钮)处理一个命令消息。 当一个命令对象通过指定的ID接受到一个Windows WM_COMMAND消息时,ON_COMMAND将调用成员函数memberFxn处理此消 息。在用户的消息映射中,对于每个菜单或加速器命令(必须被映射到一个消息处理函数)应该确实有一个ON_COMMAND宏语句。

2、ON_MESSAGE(message,memberFxn)
指明哪个函数将处理一用户定义消息。用户定义消息通常定义在WM_USER到0x7FF范围内。用户定义消息是那些不是标准 Windows WM_MESSAGE消息的任何消息。在用户的消息映射中,每个必须被映射到一个消息处理函数。用户定义消息应该有一个 ON_MESSAGE宏语句。

3、ON_Update_COMMAND_UI(id,memberFxn)
此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个用户接口更改命令消息。在用户的消息映射中,每个用户接口更改命令(比讯被映射到一个消息处理函数)应该有一个ON_Update_COMMAND_UI宏语句。
4、ON_VBXEVENT(wNotifyCode,memberFxn)
此宏通常通过ClassWizard被插入一个消息映射,以指明哪个函数将处理一个来自VBX控制的消息。在用户的消息映射中每个被映射到一消息处理函数的VBX控制消息应该有一个宏语句。
5、ON_REGISTERED_MESSAGE(nmessageVarible,memberFxn)
Windows的RegisterWindowsMesage函数用于定义一个新窗口消息,此消息保证在整个系统中是唯一的。此宏表明哪个函数处理已注册消息。变量nMessageViable应以NEAR修饰符来定义。

6、ON_CONTROL(wNotifyCode,id,memberFxn)
表明哪个函数将处理一个常规控制表示消息。控制标识消息是那些从一个控制夫发送到母窗口的消息。

 

 

分享到:
评论

相关推荐

    ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别

    ### ON_COMMAND、ON_MESSAGE、ON_NOTIFY 的区别与深入解析 #### 一、概述 在Windows编程尤其是使用MFC(Microsoft Foundation Classes)框架进行GUI应用程序开发的过程中,经常需要处理各种各样的用户输入事件以及...

    C++消息处理[参考].pdf

    - `ON_NOTIFY_EX(通知码, nID, fn)`:允许在多个对象中处理消息,返回值与`ON_COMMAND_EX`类似。 对于`WM_NOTIFY`消息,`NMHDR`结构体包含了发送消息的控件的句柄、ID和通知码。`ON_NOTIFY_EX`宏提供了一个更灵活...

    MFC-message.rar_Mfc message_site:www.pudn.com

    在MFC中,每个窗口类都有一个消息映射表(Message Map),这个表定义了各种消息与处理这些消息的方法之间的关系。 1. **消息映射表(Message Map)**:MFC通过消息映射来定义窗口如何响应特定的消息。例如,`ON_...

    深入BCB理解VCL的消息机制.rar_bcb_vcl

    消息映射使用`TMessageMapper`类进行管理,通过`ON_MESSAGE`、`ON_COMMAND`、`ON_NOTIFY`等宏来定义消息处理函数。 **三、消息处理函数** 1. **ON_MESSAGE**: 处理自定义消息,这类消息通常不是Windows标准消息,...

    第四课 MFC消息映射机制的剖析 讲述如何运用ClassWizard 2.rar

    6. 探讨消息映射的内部实现:理解`ON_MESSAGE`, `ON_COMMAND`, `ON_BN_CLICKED`等宏的工作原理,以及它们如何将消息与函数关联。 课程中的SWF文件可能是视频教程或演示,用于可视化地展示以上概念和操作步骤。通过...

    Windows-MFC程序-10.MFC控件(二)

    开发者可以使用BEGIN_MESSAGE_MAP、END_MESSAGE_MAP宏定义消息映射,并使用ON_MESSAGE、ON_COMMAND等宏映射特定消息到处理函数。例如,处理按钮点击事件,可以写成: ```cpp BEGIN_MESSAGE_MAP(MyDialog, CDialog) ...

    MFC中的RTTI,动态创建,消息机制

    - MFC的消息机制还支持对象间的通信,如通过`ON_UPDATE_COMMAND_UI`宏更新用户界面元素的状态,或者通过`ON_NOTIFY`处理控件的通知消息。 理解并熟练掌握MFC中的RTTI、动态创建和消息机制对于开发高效、可靠的...

    MyDlg.rar_SDK vc_Vc_vc sdk_visual c_编写对话框

    与MFC的ON_MESSAGE、ON_COMMAND等宏不同,SDK编程需要直接处理WM_COMMAND、WM_INITDIALOG等Windows消息。 3. **控件创建**:在SDK中,每个对话框控件(如按钮、文本框)都需要通过CreateWindow或CreateWindowEx函数...

    VC托盘程序

    ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) ON_WM_SYSCOMMAND() END_MESSAGE_MAP() void CMainFrame::OnViewMainWindow() { if (IsWindowVisible()) { ShowWindow(SW_SHOWMINIMIZED); ShowWindow(SW_HIDE...

    MFC 多个窗口消息共享同一个消息处理函数demo

    消息映射是通过ON_MESSAGE、ON_COMMAND、ON_NOTIFY等宏定义的,这些宏将特定的消息ID与处理函数关联起来。当我们创建一个窗口时,MFC会自动为这个窗口建立消息队列,并将消息映射表应用到该窗口上。 在传统的MFC...

    vc中消息传递机制

    通过定义类的`ON_MESSAGE`、`ON_COMMAND`等宏,可以指定特定消息应调用哪个成员函数来处理。 5. **消息映射函数**:在MFC中,消息映射函数通常以`OnXXX`形式命名,如`OnPaint`用于处理WM_PAINT消息,`OnClose`处理...

    编程高手箴言

    值得注意的是,`WM_COMMAND`、`WM_NOTIFY`以及`ON_UPDATE_COMMAND_UI`这三个消息有特殊的转换规则。 为了在项目中启用消息反射,可以使用ClassWizard工具进行辅助。步骤包括:选择Message Maps选项,指定目标类,...

    VC中的消息编程[归纳].pdf

    通过定义`ON_MESSAGE`、`ON_COMMAND`等宏,可以将特定的消息与成员函数关联起来,简化代码编写。 8. **消息反射机制** 消息反射允许控件将接收到的消息反射回父窗口,使得父窗口可以直接处理控件的事件,增强了...

    在类VC的界面实现中加入目录树 源代码

    打开对话框类的头文件(例如CMyDialog.h),在消息映射`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`之间,添加`ON_NOTIFY`消息映射项。例如: ```cpp ON_NOTIFY(TVN_SELCHANGED, IDC_TREECTRL1, ...

    VC 通用控件类的扩展

    在派生类中,可以通过ON_MESSAGE、ON_COMMAND、ON_BN_CLICKED等宏定义新的消息处理函数,以便处理特定的消息或事件。 3. **覆写虚函数**:许多MFC控件类中的函数是虚函数,例如OnDraw(),这是为了让子类有机会修改...

    深度解析VC中的消息

    MFC的CWinApp、CWnd、CButton等类都包含了消息映射表,通过ON_MESSAGE、ON_COMMAND和ON_BN_CLICKED等宏将消息与成员函数关联,使得消息处理更加直观和便捷。 总的来说,Windows的消息机制是程序响应用户输入和系统...

    MFC实现listCtrl双击表格,实现文本输入。

    GetParent()->PostMessage(WM_COMMAND, EN_KILLFOCUS, (LPARAM)m_hWnd); } ``` 在`CYourDialogClass`中,添加`UpdateListItem`函数,以更新ListCtrl中的文本: ```cpp void CYourDialogClass::UpdateListItem(int...

    MFC单文档托盘程序示例

    2. **处理WM_NOTIFYMESSAGE消息**:当用户在托盘图标上点击或执行右键操作时,系统会发送`WM_NOTIFYMESSAGE`消息。你需要在`CWinApp`的`OnMessageReflect`或`PreTranslateMessage`函数中处理这些消息。 3. **添加...

    MFC下父窗口与子窗口的数据发送

    例如,父窗口可以调用`SendMessage`向子窗口发送一个自定义消息,子窗口通过`ON_MESSAGE`宏定义处理函数,并在处理函数中返回所需的数据。 6. **使用`UpdateData`函数**: 对于对话框(CDialog派生类),可以利用`...

    MFC类库参考手册

    开发者通过在类定义中添加ON_MESSAGE、ON_COMMAND或ON_NOTIFY等宏,将消息与成员函数关联起来,以便处理来自用户的输入。 MFC还包含一些用于数据库访问的类,如CDatabase、CRecordset,它们简化了ODBC(Open ...

Global site tag (gtag.js) - Google Analytics