`
mof51mof
  • 浏览: 19638 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

MFC消息处理和消息映射的概念

 
阅读更多

MFC消息处理和消息映射的概念
2011年08月25日
  MFC消息处理和消息映射的概念(一)
  1、消息处理和消息映射的概念
  2、消息种类
  3、常用消息
  4、消息处理函数
  5、消息映射
  所有windows应用程序都是消息驱动的,消息处理是所有windows应用程序的核心部分。当用户单击鼠标或改变窗口大小时,都将给适当的窗口发送消息。每个消息都对应于某个特定的事件。
  一、消息处理和消息映射的概念
  1、消息
  消息主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息。例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息。
  2、windows消息组成结构
  windows消息由消息号和参数组成:
  消息号
  windows操作系统通过32整数标识一条windows消息,称为消息号。windows消息号具有三个特点:
  (1)唯一性
  唯一性指对于windows操作系统中的每一条消息都有一个且只有一个消息号与它相对应。由于windows操作系统通过消息激活相应的过程,因此消息的标识必须是唯一的。
  (2) 直观性
  消息号在形式上表现为消息名,消息名往住直观地说明了消息的产生方式和类型,例如消息名WM_LBUTTONDOWN直观地表示了单击产生的消息。
  (3)可自定义性
  windows系统定义了一些消息号和消息名,程序员可以运用这些消息,也可以使用自已定义的窗口的消息。形式如下:
  #define 消息名消息号
  注意,为了不与现有的windows系统消息相冲突,在消息号的定义中通常采用如下:
  WM_USER+n WM_USER是windows操作系统定义的用户消息起始值,程序员必须从该起始值后选取消息号,例如自定义消息名为“MESSAGE_1”和“MESSAGE_2”,可采用如下形式:
  #define MESSAGE_1 WM_USER+1
  #DEFINE MESSAGE_2 WM_USER+2
  参数
  windows的消息具有以下两个参数:
  (1)字参数(wParam)
  (2)长参数(lParam)
  字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。
  3、消息处理
  在MFC中,每个专门的处理函数旱单独处理每个消息。消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务。
  可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处理代码。
  4、消息映射
  可以接收消息和命令的所有框架类都有自已的消息映射。框架利用消息映射把消息、命令与它们的处理函数链接起来。从CCmdTarget类派生的任何类都可以有消息映射。虽然叫作“消息映射”,但消息映射既可以处理消息,也可以处理命令。
  二、消息种类
  消息主要有三种类型,即windows消息,命令消息和控件通知。
  按消息的产生可以分为四类:
  *(1)外界输入事件产生的消息
  *(2)windows系统向应用程序发出的消息
  *(3)应用程序之间发送的消息
  *(4)其他
  MFC消息处理和消息映射的概念(二)
  根据产生消息的对象,可以进一步将消息分为以下几类: 略
  1、windows消息
  除WM_COMMAND外,所有以WM_开头的消息都是windows消息。windows消息由窗口和视图处理。这类消息通常含有用于确定如何对消息进行处理的一些参数。
  2、控件消息
  控件通知包含从控件和其他子窗口传递给父窗口的WM_COMMAND通知消息。例如,当用户改变编辑控件中的文本时,编辑控件将发送给父窗(例如对话框)一条含有EN_EXCHANGE控件通知码的WM_COMMAND消息。窗口的消息处理函数将以适当的方式对通知消息作出响应,如获取编辑框中的文本等。
  像其他标准windows消息一样,控件通知消息由窗口和视图进行处理。但是如果用户单击控件按钮时发出的BN_CLICKED控件通知消息将作为命令消息来处理。
  3、命令消息
  命令消息包括来自用户界面对象的WM_COMMAND通知消息。菜单项、工具栏按钮和加速键都是可以产生命令的用户界面对象。每个这样的对象都有一个ID。通过给对象和命令分配给同一个ID可以把用户界面对象和命令联系起来。命令是被作为特殊的消息来处理的。
  通常,命令ID是以其表示的用户界面对象的功能来命名的。例如,Edit菜单中的Copy命令就可以用ID_EDIT_COPY来表示。MFC类库预定义了某些命令ID(如ID_EDIT_PASTE和ID_FILE_OPEN等等)。其他命令ID则要编程人员自已定义,所有预定义命令ID的列表,参见AFXRES.H文件。
  命令消息的处理和其他消息的处理不同。命令消息可以被更广泛的对象(如文档、文档模板、应用程序对象、窗口和视图等)处理。windows把命令发送给多个候选对象,称为命令目标。通常其中一个对象有针对该命令的处理函数。处理函数处理命令的方法和处理windows消息的方法是一样的。但调用机制不一样。 三、常用消息
  windows中一些常用的消息:略
  四、消息处理函数
  1、windows消息和控件通知的处理函数
  windows消息和控件通知都是由派生于CWnd的窗口类对象处理的。它们包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些派生的用户自定义的类。这样的类对象封装了windows窗口句柄HWND。
  windows消息和控件通知都有默认的处理函数,这些函数在CWnd类中进行了预定义,MFC类库以消息名为基础形成这些处理函数的名称,这些处理函数的名称都以前缀"On"开始。有的处理函数不带参数,有的则有几个参数;有的还有除void以外的返回值类型。CWnd中消息处理函数的说明都有afx_msg前缀。关键字afx_msg用于把处理函数和其他CWnd成员函数区分开来。例如,消息WM_PAINT的处理函数在CWnd中被声明成:
  afx_msg void OnPaint();
  windows消息常见的有鼠标消息(如WM_LBUTTONDOWN)消息)、键盘字符消息(WM_CHAR消息)、键盘按键消息(WM_KEYDOWN)、窗口重画消息WM_PAINT,水平和垂直条滚动消息WM_HSCROLL和WM_VSCROLL)以及系统时钟消息WM_TIMER等。
  2、命令消息的处理函数
  由于用户界面的对象是用户自已定义的,每个应用程序的用户界面对象千差万别,所以对用户界面对象的命令消息没有默认的处理函数。如果某条命令直接影响某个对象,则应该让这个对象来处理这条命令。例如FILE菜单上的Open命令当然与应用程序有关:应用程序打开一个特定的文档来响应该命令。报以,Open命令的处理函数是应用程序类的一个成员函数。
  把命令消息映射成处理函数时,ClassWizard以命令ID来命名处理函数,可以接受、修改、或替换推荐使用的名字。例如,Edit菜单项的Cut命令,对应ID就是ID_EDIT_CUT,处理函数被命名成:
  afx_msg void OnEditCut();
  此外,对于控件按钮的BN_CLICKED通知消息,其处理函数可以被命名为:
  afx_msg void OnClickedUseAsDefault();
  命令消息的处理函数没有参数值,也不返回值。
  五、消息映射
  用MFC Application Wizard 创建应用程序框架时,AppWizard为创建的每个命令目标类(包括派生的应用程序对象、文档、视图、和边框窗口等)编写一个消息映射。每个命令目标类的消息映射存在相应的.cpp文件中。可以在AppWizard创建的基本消息映射的基础上,使用ClassWizard为每个类将处理的消息和命令添加一些条目。例如,对于应用程序类,MFC AppWizard创建的基本消息映射为:
  BEGIN_MESSAGE_MAP(CTextEditApp,CWinApp)
  //{{AFX_MSG_MAP(CTextEditApp)
  ON_COMMAND(ID_APP_ABOUT,OnAppAbout)
  //注:ClassWizard将在此处添加和删除消息映射宏
  //不要编辑这些生成的代码块
  //}}AFX_MSG_MAP
  //基于标准文件的文档命令(新建和打开)
  ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)
  ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)
  //标准的打印设置命令
  ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp::OnFilePrintSetup)
  END_MESSAGE_MAP()
分享到:
评论

相关推荐

    mfc消息处理和消息映射的概念.doc

    所有windows应用程序都是消息驱动的,消息处理是所有windows应用程序的核心部分。当用户单击鼠标或改变窗口大小时,都将给适当的窗口发送消息。每个消息都对应于某个特定的事件。

    mfc教程(word版)

    4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC...

    MFC深入浅出带目录完整版(李久进chm版)

    如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四章,应该把重点放在MFC的设计和实现的分析上。这样,可以深化您对MFC和Windows编程的理解与掌握...

    MFC深入浅出(李久进)图全

    如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四章,应该把重点放在MFC的设计和实现的分析上。这样,可以深化您对MFC和Windows编程的理解与掌握...

    深入解析MFC

    CCmdTarget和消息映射表 窗口消息 MFC消息映射内幕 MFC如何使用消息映射表 进入消息循环:PreTranslateMessage() 结语 第4章 MFC实用类 简单值类型 MFC的集合类 CFile家族:MFC对文件的访问 CExcephon:提供更好的...

    MFC-李进九 电子书籍完整版

    4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC...

    精通MFC (光盘) 源代码

    2.4 消息和消息处理 2.4.1 系统定义的消息 2.4.2 应用程序定义的消息 2.4.3 消息参数 2.4.4 消息队列 2.4.5 消息循列 2.4.6 窗口过程 2.5 窗口应用框架 2.6 小结 第3章 MFC简介 3.1 MFC的优势 3.2 MFC中...

    深入浅出MFC【侯捷】

    消息循环 窗口的生命中枢:窗口函数 消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 ...

    MFC教程入门知识全集.rar

    4.5 MFC 消息映射机制 4.5.1 消息的种类 4.5.2 应用程序的Run 函数 4.5.3 消息映射表 4.5.4 如何添加消息映射 4.6 ClssWizard 的使用 4.6.1 ClssWizard 概貌 4.6.2 如何添加消息处理函数 4.6.3 如何添加成员...

    C++MFC教程

    MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。...

    深入浅出MFC 2e

    消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32...

    侯捷- -深入浅出MFC

    消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32...

    VISUAL C++MFC扩展编程实例

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    Visual C++ MFC扩展编程实例.PDF

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    MFC简介,可以通过该文档学会初步运用MFC编写小型程序

    关于MFC的介绍,该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。在本节中,你将会输入、编译和运行一个简单的MFC程序。下一节中将向你详细解释这些...第四部分将介绍消息映射,你将会处理MFC的事件。

    VISUAL C MFC扩展编程实例与源码

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。  全书分为三个部分和附录。第一部分...

    Visual C++ MFC 简明教程

    Visual C++ MFC 简明教程 原著:Marshall Brain 编译:张圣华 第一部分:MFC导论 Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分...第四部分将介绍消息映射,你将会处理MFC的事件。

    深入浅出MFC-简体版(2)PDF

    消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32...

    VISUAL C++ MFC 简明教程

    Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 ...第四部分将介绍消息映射,你将会处理MFC的事件。 原来是DOC版本的,我把它搞成了PDF的,还不错的说。

Global site tag (gtag.js) - Google Analytics