`
beckshanling
  • 浏览: 255602 次
  • 性别: 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它们的区别,详细介绍这三种消息模型

    Visual_C++_6.0_MFC_入门

    MESSAGE_MAP2.2 在窗口中输出文字.2.3 使用点、刷子、笔进行绘2.4 在窗口中绘制设备相关位图、图标、设备无关位图CDC memDC;//定义一个兼容DC2.5 使用各种映射方式2.6 多边形和剪贴区域3.1 文档视图框架窗口间的...

    VC托盘程序

    ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) ON_WM_SYSCOMMAND() //}}AFX_MSG_MAP END_MESSAGE_MAP() 2. void CMainFrame::OnViewMainWindow() { if(IsWindowVisible()) { ShowWindow(SW_SHOWMINIMIZED); ...

    c++播放器代码

    ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER2, OnReleasedcaptureSlider2) ON_WM_CTLCOLOR() //}}AFX_MSG_MAP END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////////...

    MFC制作的MP3

    mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms); } void Mp3::Pause() { mciSendCommand(DeviceID,MCI_PAUSE,0,0); } void Mp3::resum() { mciSendCommand(DeviceID,MCI_...

    stdafx.h代码

    // CommandLine parsing helper class CDocManager; // CDocTemplate manager object ///////////////////////////////////////////////////////////////////////////// // Type modifier for message handlers...

    数字识别之神经网络法

    ON_NOTIFY(UDN_DELTAPOS, IDC_TRAINSPIN, OnDeltaposTrainspin) ON_NOTIFY(UDN_DELTAPOS, IDC_TESTSPIN, OnDeltaposTestspin) //}}AFX_MSG_MAP END_MESSAGE_MAP() ////////////////////////////////////////////...

    C++MFC教程

    // ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) case(WM_COMMAND): if(HIWORD(wP)==ID_FONT_DROPDOWN) { DoNothing(...); } break; //END_MESSAGE_MAP() } } newWndProc就是窗口过程只要是该类的...

    微软内部资料-SQL性能优化3

    For example, a shared intent lock placed at the table level means that a transaction intends on placing shared (S) locks on pages or rows within that table. Setting an intent lock at the table level ...

    CE中文版-启点CE过NP中文.exe

    Fixed lua command fullAccess Fixed text to speech if launched from a different thread Fixed clicking on checkboxes when the dpi is different Fixed the found code dialog count size Fixed mono freezing ...

    Laravel 5.x Cookbook (Packt 2016)

    Implementing an error message template 65 Building your main search page 70 Adding a static page 76 Chapter 5: Working with Data 79 Introduction 79 Setting up users and running migrations 79 Altering ...

    2009 达内Unix学习笔记

    与加权限不一样,赋权限有覆盖的效果。 主要形式有如下几种 chmod u+rw chmod u=rw chmod u+r, u+w chmod u+rw,g+w, o+r chmod 777( 用数字的方式设置权限是最常用的) 数字表示权限时,各数位分别表示属主、属...

    acpi控制笔记本风扇转速

    the Switch() operator is within a while loop, causing an error on the second iteration. (BZ 460) Disassembler - fix for error emitted for unknown type for target of scope operator. Now, ignore it and...

    用JavaScript对JSON进行模式匹配(Part 1-设计)

    一个最简单的用例是这样的: 代码如下: Dispatcher.capture({ “status”: 200, “command”: “message” }, function(json) { /* display message */ }); Dispatcher.notify({ “status”: 200,

    数位板压力测试

    6. Message Reference 36 6.1. Event Messages 36 6.1.1. WT_PACKET 36 6.1.2. WT_CSRCHANGE (1.1) 37 6.2. Context Messages 37 6.2.1. WT_CTXOPEN 37 6.2.2. WT_CTXCLOSE 37 6.2.3. WT_CTXUPDATE 38 6.2.4. WT_...

    外文翻译 stus MVC

    This stateless behavior made it difficult for the model to notify the view of changes. On the Web, the browser has to re-query the server to discover modification to the state of the application. ...

    .htaccess

    <br>To prevent against this (without creating lots of new 'index' files, you can enter a command into your .htaccess file to stop the directory list from being shown: 为避免这种情况(而不必创建...

Global site tag (gtag.js) - Google Analytics