1、返回返回第四章利用MFC开发Windows应用程序本章导读本章导读理解MFC的概念和作用。理解Windows应用程序的特点和运行机制。掌握利用MFCAppwizard创建Windows应用程序的步骤和方法,弄清MFCAppwizard所创建的应用程序中所产生的主要类及其功能、组成文件和程序的框架结构。理解消息的概念,掌握编写Windows应用程序过程中所涉及到的消息的种类、特点、消息的发送和接收的基本过程和机制。掌握消息映射、消息处理函数的概念及二者间的关系。掌握利用ClassWizard增加、修改和删除窗口消息处理函数的方法和步骤,并理解程序代码的变化过程和特点。1返回返回本章导读MFC(M
2、icrosoft Foundation Class)是Microsoft公司推出的Microsoft基本类库。在编写Windows应用程序时,必须编写的大量重复代码都由MFC中定义的类和支持代码提供了;不必再直接使用WindowsAPI(应用程序接口)来进行编程工作,使用MFC提供的位于WindowsAPI之上的C+库,使程序员的工作变得更加容易。在VisualC+6.0中,用户不仅可以方便地使用MFC,而且还可以使用向导(Wizard)来辅助开发应用程序。MFC实际上是一个扩展的、丰富的C+类层次结构,在MFC中封装了SDK结构、功能及应用程序框架内部技术,隐藏了过去许多Windows程序不
3、得不处理的许多重复工作。因此,从本章开始,将着重讨论如何利用VisualC+6.0的强大功能开发Windows下的应用程序。2返回返回4.1 Windows应用程序的特点与消息驱动机制基于Windows操作系统的应用程序的特点是:标准的图形用户界面,比如窗口、菜单、按钮、列表框等;应用程序与硬件无关的特性,对于同一类硬件,不论厂家、型号,程序都无需进行任何修改就可以运行;所有的Windows应用程序都是消息驱动机制,也就是说Windows程序是通过操作系统发送的消息来处理用户的输入的。在进行Windows编程之前,必须了解Windows的运行机制。在Windows操作系统中,无论是系统产生的动
4、作或是用户运行应用程序产生的动作都称为事件(Events)产生的消息(Message)。无论是Windows应用程序的设计、还是它的应用,都是基于消息驱动方式的,这是Windows应用程序与传统的应3返回返回用程序最大的区别。在传统的编程方式中,程序是主动的。程序主动执行,只有当需要用户通过键盘或鼠标输入信息时,才进行查询或等待。获得输入后,程序继续运行。而Windows应用程序是被动的,正常情况下,只是等待被消息触发。当用户点击鼠标或按下了键盘,则由操作系统将这些操作转化为特殊的消息,传递给应用程序,应用程序再用对应的消息处理过程进行处理,处理完毕后,继续等待下一个消息。消息驱动是Windo
5、ws操作系统的一大特色,操作系统将包括用户输入在内的各种事件以消息的形式发送到目标,目标系统再根据消息的具体内容进行相应的处理。4.1 Windows应用程序的特点与消息驱动机制4返回返回4.2 利用MFC Appwizard 创建Windows应用程序在C+中,事物之间的关系是通过类的派生和类的成员函数的重载来反映的。而在VisualC+6.0中,类同样是最重要的元素。如一个字符串可以是类Cstring的对象,一个窗口可以是类CWnd的对象,一个对话框可以是类Cdialog的对象等等。VisualC+6.0中的MFCAppWizard(应用程序向导)可以使用户自动生成一些常用的标准程序结构和
6、编程风格。例如一般的Windows应用程序结构、DLL应用程序结构、单文档(SDI)应用程序结构、多文档(MDI)应用程序结构等。下面详细介绍利用MFCAppWizard创建一个Windows应用程序的步骤:第第零零步步启动VisualC+6.0,选择【File】菜单下的【New】菜 单 项,选 择【Projects】标 签,选 择【MFCAppWizard(exe)】项目类型,在【Projectname】中输入5返回返回项目名MyExp,定位于“E:C+EXAMPLE”文件夹中,单击【OK】按钮。第第一一步步选择【Singledocument】应用类型,即单文档应用程序,其他使用默认值,单击
7、【Next】按钮。第第二二步步让用户选择程序中是否加入数据库支持,在此使用默认值【None】,单击【Next】按钮。第第三三步步让用户选择在程序中加入复合文档,自动化或ActiveX控件的支持,在此使用默认值,单击【Next】按钮。第第四四步步让用户选择应用程序的一些特性,在此使用默认值,单击【Next】按钮。第第五五步步让用户选择应用程序主窗口的风格、在源文件中是否加入注释、使用怎样的MFC类库,在此使用默认值,单击【Next】按钮。4.2 利用MFC Appwizard 创建Windows应用程序6返回返回第第六六步步用户可以对MFCAppWizard提供的缺省类名、基类名、头文件名、源文
8、件名进行修改,使用默认值,单击【Finish】按钮。则会显示出用户在前面几个步骤中作出的选择内容,单击【OK】按钮,系统开始创建应用程序,并回到VisualC+6.0的主界面。运行过的应用程序MyExp可以脱离VisualC+6.0单独运行,运行该文档可以双击“E:C+EXAMPLEDebug”下的MyExp.exe文件。和所有的Windows应用程序一样,MyExp也包含标题栏、菜单栏、工具栏、状态栏等窗口元素。4.2 利用MFC Appwizard 创建Windows应用程序7返回返回4.3 MFC应用程序的类和文件4.3.1 类说明类说明AppWiZard在生成应用程序时,共派生了5个类
9、单击“MyExpclasses”左侧的“+”展开所有的类,即可显示出应用程序MyExp的5个类,其中:CAboutDlg:关于About对话框的对话框类CMainFrame:主框架窗口类CMyExpApp:应用程序类CMyExpDoc:文档类CMyExpView:视图类在工程中,每个类都拥有自己的类定义文件(*.H)和类实现文件(*.CPP)。类定义文件主要保存各种类的定义;类实现文件主要保存各种类的成员函数的实现代码。8返回返回下面分别对这5个类进行说明:关于关于About对话框的对话框类对话框的对话框类CAboutDlgCAboutDlg是工程MyExp的对话框类,它是由MFC类库中的CD
10、ialog类派生而来的。主框架窗口类主框架窗口类CMainFrame CMainFrame是工程MyExp的主框架窗口类,它的基类是 CFrameWnd。头 文 件 为 MainFrm.h,实 现 文 件 为MainFrm.cpp。主框架窗口类用于管理主程序的窗口,来显示窗口的标题栏、工具栏、状态栏等;同时还处理对窗口操作的消息,例如窗口最大化、最小化、改变窗口大小等一般操作。视图窗口是主框架窗口的子集,对于多文档界面(MDI)应用程序,主框架窗口是所有MDI子窗口的容器。4.3 MFC应用程序的类和文件9返回返回 应用程序类应用程序类CMyExpApp CMyExpApp是工程MyExp的应
11、用程序类,它的基类是CWinApp。头文件为MyExp.h,实现文件为MyExp.cpp。应用程序类管理程序的整体,控制应用程序的所有对象,包括文档、视图和边框窗口,并完成应用程序的初始化工作和程序退出时的清除工作。注意:每个基于MFC的应用程序都必须有一个从CWinApp类派生的对象。文档类文档类CMyExpDocCMyExpDoc是工程MyExp的文档类,它的基类是CDocument。头 文 件 为 MyExpDoc.h,实 现 文 件 为MyExpDoc.cpp。4.3 MFC应用程序的类和文件10返回返回文档类负责存放程序的数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。文档类
12、必须通过视图类实现与用户的交互。视图类视图类CMyExpView CMyExpView是工程MyExp的视图类,它的基类是CView。头 文 件 为 MyExpView.h,实 现 文 件 为MyExpView.cpp。视图类主要负责管理视图窗口,显示文档类中的数据,可以显示在屏幕上,也可以输出到打印机或其他设备上;也负责处理用户数据,接受用户对数据的鼠标、键盘操作并传送给文档类对象。4.3 MFC应用程序的类和文件11返回返回4.3 MFC应用程序的类和文件4.3.2 文件说明文件说明AppWizard在自动生成工程时,除了生成上面介绍的各个类的头文件和实现文件外,还生成了一些为建立应用程序
13、所需要的其他文件。这些文件可以在应用程序生成时指定的路径(E:C+EXAMPLEMyExp)中找到,下面分别对这些文件加以说明:1.MyExp.clw:Class Wizard的信息存储文件,存储由ClassWizard编辑已有的类或添加新类的信息,存储由ClassWizard建立和编辑各种消息处理函数和映射变量等的信息。2.MyExp.dsp:Project文件,即工程文件。Project文件中保存着工程的各种信息,一个工程文件对应一个工程应用程序。12返回返回3.MyExp.dsw:Workspace文件。一个Workspace文件可包含一个或多个工程。4.MyExp.rc:资源定义文件,
14、包含程序资源的定义,其中保存了应用程序中使用到的各种资源的信息,包括存贮在文件夹中的图标、位图和光标等。5.Resource.h:标准的头文件,它包含了所有资源符号的定义,与MyExp.rc文件相对应。6.StdAfx.h:包含在所有AppWizard程序中的标准头文件,它用于包含其他包含在预编译头文件中文件。7.StdAfx.cpp:包含在所有AppWizard程序中,它包含所有标准include文件。8.resMyExpDoc.ico:文件中包含了打开文档时所用的图标文件。4.3 MFC应用程序的类和文件13返回返回9.resMyExp.rc2:资源定义文件,包含了用vc不能直接编辑的资源
15、。可以将所有不能由资源编辑器编辑的资源放置到这个文件中。10.resMyExp.ico:应用程序的图标文件。应用程序图标包含在资源文件MyExp.rc中。11.resToolbar.bmp:用于创建工具栏按钮的位图文件。初始栏工具栏和状态栏是在主边框窗口类中构造的。12.ReadMe.txt:包含了对所有该程序的文件的解释信息,并说明了所有创建的类。另 外,如 果 在 App Wizard的 第 4步 中 选 择 了Context_sensitiveHelp选项,则AppWizard会自动生成一个.hpj文件和一些.rtf文件,它们用以给出上下文的帮助。4.3 MFC应用程序的类和文件14返回
16、返回Windows应用程序一般是由消息驱动的(message-driven),这也是Windows编程方式与其他编程方式最大的不同之处。消息就是操作系统通知应用程序某件事情已经发生的一种方式。例如,当用户移动或双击鼠标、改变窗口大小等,都将向适当的窗口发送消息,一个窗口可以向另一个窗口发送消息,并且大多数窗口通过向其他窗口发送一个稍有不同的消息来响应消息。Windows系统中的消息主要有三种类型:标准的Windows消息、控件消息和命令消息。4.4 Windows消息15返回返回4.4 Windows消息4.4.1 标准的标准的Windows消息消息所有以WM_为前缀的消息都是标准的Windo
17、ws消息(WM_COMMAND消 息 除 外),如 WM_PAINT、WM_QUIT等,这些消息通常含有用于确定如何对消息进行处理的一些参数。标准的Windows消息一般由窗口对象和视图对象进行处理。窗口对象指的是从CWnd中派 生 出 的 类 的 对 象,如 从 CWnd、CFrameWnd、CMDIFrameWnd、CMDIChildWnd、Cview、Cdialog等MFC类或这些类的派生类定义的对象(这些类都是CWnd类直接或间接派生的)。16返回返回4.4 Windows消息标准的Windows消息可以分为三类,即键盘消息、鼠标消息和窗口消息。下面分别加以说明。键盘消息键盘消息当键盘
18、的某个键被按下时,将产生WM_CHAR消息,这个消息带有字符代码值、重复次数和先前状态码三个参数。WM_CHAR消息的处理函数为OnChar(),此函数的原型为:afx_msgvoidOnchar(UINTnChar,UINTnRepCnt,UINTnFlags);其中:nChar是所按键的字符代码值;nRepCnt是重复的次数,它表示用户按键时重复击键的次数;nFlags表示扫描码、先前键状态和键转换状态等,其参数值功能描述见表4.1所示。17返回返回4.4 Windows消息位含义015指明键重复按下的次数1623指定扫描码,依赖于具体厂家的按键值24如果同时按下扩展键(如功能键Alt、C
19、trl),则置为1,否则置为02528由Windows内部使用29若同时按下了Alt键,则置为1,否则置为030指明先前键状态。若消息发出前键是按下的,则置为1,否则置为031指明键转换状态。若按键已松开,则置为1,否则置为0表4.1nFlags参数值功能描述18返回返回4.4 Windows消息鼠标消息鼠标消息在Windows中处理鼠标的操作基本上有三种:1.单击(Click)2.双击(Double Click)3.拖动(Drag)2.所有这些鼠标的操作,都会产生相应的消息。鼠标移动时产生WM_MOUSEMOVE消息,鼠标左键按下时产生WM_LBUTTONDOWN消 息,鼠 标 右 键 按
20、下 时 产 生WM_RBUTTONDOWN消 息,鼠 标 左 键 双 击 时 产 生WM_LBOTTONDBLCLK消息等等。所有这些鼠标消息的处理函数都有相似的原型,它们都有两个参数。我们以处理鼠标左键按下的消息函数OnLButtonDown()为例来进行说明。此函数的原型如下:afx_msgvoidOnLButtonDown(UINTnFlags,Cpointpoint);其中:参数point是鼠标事件发生时鼠标光标所在的位置,它是相对于窗口左上角的水平坐标和垂直坐标而言的。19返回返回4.4 Windows消息参数nFlag指明鼠标按钮的状态以及鼠标事件发生时键盘上某些键的状态,每一状态
21、都可以由nFlag的一位来表示。我们可以从表4.2中所列的位屏蔽中得到每一位。4.2nFlags参数每位的含义其中,MK_CONTROL、MK_LBUTTON、MK_MBUTTON、MK_MBUTTON、MK_RBUTTON和MK_SHIFT都是预定义的宏。位屏蔽含义MK_CONTROLCtrl键按下时设置MK_LBUTTON鼠标左键按下时设置MK_MBUTTON鼠标中间键按下时设置MK_RBUTTON鼠标右键按下时设置MK_SHIFTShift键按下时设置20返回返回4.4 Windows消息 窗口消息窗口消息所有窗口的变化,包括窗口内容重绘WM_PAINT、窗口最大化WM_MAXIMIZE
22、、窗口最小化WM_MINIMIZE、窗口重定义大小WM_RESIZE、窗口滚动WM_HSCROLL、WM_VSCROLL、窗口定时WM_TIMER等消息所带参数各不相同。在这里我们来详细讨论一下WM_PAINT消息。当调用成员函数UpdateWindow()或RedrawWindow()要求重新绘制窗口内容时,应用程序将收到WM_PAINT消息。当窗口最小化后再还原或被其他窗口遮盖后又重新显示时,则当前窗口中的内容必须重新绘制,消息WM_PAINT就是为实现这个功能的。21返回返回4.4 Windows消息当向Windows应用程序发送WM_PAINT消息,应用程序检索到此消息后,就重新显示窗
23、口中的内容。WM_PAINT消息的处理函数为OnPaint()。函数原型为:afx_msgvoidOnPaint();如果想详细了解所有的标准的Windows消息,可以参阅VisualC+6.0联机帮助中的有关内容。4.4.2 控件消息控件消息控件是一个小的子窗口,属于其他窗口(如对话框等),能够接受操作并象父窗口发送消息。常见的控件有按钮、列表框、编辑框、复合框、滚动条等。在VisualC+6.0中,对控件的操作都是通过生成相应的控件类来进行。这些控件类仅能发送少量特定的消息,这些消息就叫做控件消息。发送控件消息的控件在VisualC+中22返回返回4.4 Windows消息使用唯一ID号来
24、进行标识,使用控件类来操纵。控件消息分为两类:1.从控件传给消息,通常这类消息的前缀的最后一个字符为N;2.由系统发送给控件的消息,这类消息的前缀的最后一个字符为M。例如,当用户对编辑框中的文本进行修改时,编辑框将发送给父窗口一条包含控件通知码EN_CHANGE的WM_COMMAND消息。窗口的消息处理函数将以某种适当的方式对通知消息作出响应,如检索编辑框中的文本。与其他标准的Windows消息一样,控件消息也是由窗口对象和视图对象进行处理。23返回返回4.4 Windows消息4.4.3 命令消息命令消息命令消息主要包括由用户界面对象发送的M_COMMAND消息,用户界面对象是指菜单、工具栏
25、、快捷键等。它和控件消息的区别在于:控件消息只能由特定控件向Windows系统传送,而命令消息是由用户界面发送的,它可以被更多的对象处理。在文档对象、视图对象、窗体对象、控件对象中都能处理这种消息。1.用户界面对象菜单、工具栏、快捷键等都是可以产生命令的用户界面对象。每个这样的对象都分配了一个ID号,通过给对象和命令分配同一个ID号,将用户界面对象和命令联系在一起。例如,选择程序中的【文件】菜单下的【打开】菜单项,则产生一条ID_FILE_OPEN命令,然后通过消息映射调用函数OnFileOpen()来进行处理。24返回返回4.4 Windows消息2.命令命令ID在MFC编程中,命令完全由命
26、令ID来进行描述,命令ID分配给产生此命令的用户界面对象。通常情况下,命令ID是由它所表示的用户界面对象的功能来命名的。MFC预定义了一些命令ID,如ID_EDIT_CUT、ID_FILE_SAVE等,而其他命令ID则要由编程人员自己定义。3.命令目标命令目标当用户界面对象被单击后,将调用处理函数来执行所产生的命令。Windows把非命令消息的消息直接发送给窗口,窗口中用于处理这些消息的处理函数将被调用。而对于命令消息,将把命令发送给多个目标,也就是命令目标,其中通常有一个要调用此命令的处理函数。25返回返回4.5 消息的发送和接收的基本过程和机制在Windows中,大部分的消息都是由用户和应
27、用程序的相互作用而产生的。CWinApp类的成员函数Run()用于处理消息循环,它唯一的功能就是等待消息,并将消息发送到适当的窗口。当消息循环接收到一条Windows消息时,它首先通过查询一种内部结构来确定消息要发送的窗口。这种内部结构把当前所有的窗口映像成其对应的窗口类。MFC的基类还能够检测这一目标类是否在其消息中为这一消息提供了处理函数入口。如果找到入口,则消息被送往处理函数,结束消息发送过程。如果消息无对应入口,则对目标类进行基类消息映射检测,沿着层次向上查找,直到找到入口函数为止。对于命令消息来说,查找较为复杂。通常,每个命令目标类先把命令发送给某些其他的对象,使其他对象有26返回返
28、回4.5 消息的发送和接收的基本过程和机制优先处理的机会。如果这些对象都不能处理此命令,则起始类检查自己的消息映射,若也不能处理此消息,则将命令发送给更多的命令目标。在大多数情况下,命令目标将以下列顺序发送命令:1.发送至当前活动的子命令目标对象;2.发送至其本身;3.发送至其他命令目标。【例例】在一个MDI应用程序中,如果选择了“文件”菜单中的“保存”菜单项,则产生一条命令消息。我们假定命令处理函数是应用程序文档类的成员函数,则此命令的发送顺序为:27返回返回4.5 消息的发送和接收的基本过程和机制1.命令消息首先传给主框架窗口;2.主框架窗口给当前活动的子窗口处理此命令的机会;3.视图检查
29、其消息映射,若没有找到处理函数,再把此命令发送给与其相连的文档;4.文档检查其消息映射,如果找到命令的处理函数,则调用此函数,发送过程结束,否则继续下面的步骤;5.将命令发送给文档模板,然后返回到视图,再返回边框窗口,边框窗口检查其消息映射;6.命令回送到主边框窗口,主边框窗口检查自己的消息映射;7.检测应用程序的消息映射,进到消息入口,并调用适当的处理程序。28返回返回4.6 消息映射与消息处理函数4.6.1 消息映射与消息处理函数的概念消息映射与消息处理函数的概念通过消息映射,消息就和它的处理函数对应起来。消息处理函数指的是与某个消息对应的函数。消息处理函数的执行是由其对应的消息引发的,某
30、个类对象中的消息处理函数是与这个类对象能够得到的一个消息对应的,当这个消息发生时,这个函数就会被执行。消息处理函数的定义与使用方法与类的一般的成员函数不同。一般成员函数包括两部分:函数的定义部分和函数的实现部分;而消息处理函数除了这两部分以外,还有消息映射部分。29返回返回4.6 消息映射与消息处理函数4.6.2 管理窗口消息处理函数管理窗口消息处理函数利用ClassWizard可以管理消息处理函数,ClassWizard是一个非常强大有用的工具,我们可以用ClassWizard来创建新类、定义消息处理函数、覆盖MFC的虚拟函数,从对话框、表单视图或记录视图的控件中获取数据。可以用三种方法来激
31、活ClassWizard对话框:1.选择【View】菜单中的【ClassWizard】菜单项;2.直接按下Ctrl+W键;3.在代码编辑窗口中单击鼠标右键(此时,代码编辑窗口中必须有打开的文件),在弹出菜单中选择【ClassWizard】菜单项。30返回返回4.6 消息映射与消息处理函数当执行了以上操作,窗口中将弹出【MFCClassWizard】对话框。此时显示的是【MessageMap】选项卡。在这个选项卡的最上面有两个下拉列表框:【Project】列表中显示的是当前的项目名称,【Classname】列表中显示的是正在编辑的消息映射所属的类名。选项卡的中间也有两个多行的列表框。左边的【Ob
32、jectIDs】列表框中显示的对象有三种类型:在【Classname】栏中列出的类名、菜单项对象和其他可能在【Classname】中所选的类传递消息的控件,当其中的某一个类被选中时,右面的【Messages】列表框就显示出此类的能捕获的所有Windows消息。其中还列出了一些能够捕获的普通消息的虚函数。最下面【Memberfunctions】列表中显示的是与此消息相关的类的成员函数的列表。31返回返回4.6 消息映射与消息处理函数在【MFCClassWizard】对话框中共有五个选项卡,分别说明如下:1.【MessageMaps】选项卡用于进行消息映射的处理;2.【MemberVariable
33、s】选项卡用于为对话框中的控件所用到的类创建成员变量;3.【Automation】选项卡帮助用户管理与OLE自动化相联系的方法和属性;4.【ActiveXEvents】选项卡帮助用户管理ActiveX类支持的ActiveX事件;5.【ClassInfo】选项卡显示类的一般信息,包括定义它的头文件和源文件、类名以及与之相联系的基类。32返回返回4.6 消息映射与消息处理函数4.6.2.1 增加一个窗口消息增加一个窗口消息 以应用程序MyExp为例,说明用ClassWizard增加一个窗口消息处理函数的过程。1.在VC+工作界面下打开MyExp项目,并启动ClassWizard,进入对话框界面。2
34、.从【ClassName】复合框中选择视图类CMyExpView,在【ObjectIDs】列表框中就会列出各种消息来源的组件。3.从【ObjectIDs】列表框中选择CMyExpView,在列表框【Message】中列出的就是CMyExpView类对象能够从窗口对象CWnd接受到的窗口消息和各种可重载的虚函数。从中可以找到名为WM_LBUTTONDOWN的消息,用鼠标选中这个消息。33返回返回4.6 消息映射与消息处理函数4.此时,【AddFunction】按钮处于可执行状态,单击此按钮,就会在CMyExpView类中增加一个被CWnd保护的消息处理函数OnLButtonDown。5.在【Me
35、mberfunctions】列表框中能够发现这个函数及其 对 应 的 消 息 映 射 机 制:OnLButtonDownON_WM_LBUTTONDOWN。在函数前有一个“W“标志,表 示 这 个 函 数 是 一 个 窗 口 消 息 处 理 函 数。6.单击【OK】按钮,完成一个窗口消息处理函数的增加。4.6.2.2 增加窗口消息处理函数的过程的分析增加窗口消息处理函数的过程的分析以上介绍了用ClassWizard增加一个窗口消息处理函数的过程,增加了该函数后,对于应用程序MyExp的代码做了如下的修改:34返回返回4.6 消息映射与消息处理函数1.在视图类CMyExpView中,增加了消息处
36、理函数的定义代码:/省略以上代码protected:/AFX_MSG(CMyExpView)afx_msg void OnLButtonDown(UINT nFlags,CPoint point);/单击鼠标左键调用/AFX_MSGDECLARE_MESSAGE_MAP()/省略以下代码35返回返回4.6 消息映射与消息处理函数2.在CMyExpView类的实现文件MyExpview.cpp中,增加了函数的实际代码:voidCMyExpView:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand
37、/orcalldefaultCView:OnLButtonDown(nFlags,point);3.在实现文件MyExpView.cpp中,还增加了函数的消息映射机制:BEGIN_MESSAGE_MAP(CMyExpView,CView)/AFX_MSG_MAP(CMyExpView)36返回返回4.6 消息映射与消息处理函数ON_WM_LBUTTONDOWN()/单击鼠标左键,/OnLButtonDown函数的消息映射/AFX_MSG_MAP/StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView:OnFilePrint)ON_COMMA
38、ND(ID_FILE_PRINT_DIRECT,view:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:OnFilePrintPreview)END_MESSAGE_MAP()37返回返回4.6 消息映射与消息处理函数4.6.2.3 Class Wizard 识识别别和和处处理理窗窗口口消消息息处处理理函函数数所所需需要的标识要的标识1.窗口窗口消息处理函数的定义消息处理函数的定义在类的定义文件中,ClassWizard通过以下两行固定的代码来标识消息处理函数:/AFX_MSG(CMyExpView)/ClassWizard标识消息/处理
39、函数定义的起始代码/AFX_MSG/ClassWizard标识消息处理函数定义/的结束代码AFX_MSG括号中的内容(CMyExpView)是消息处理函数所在类的名称,只有将消息处理函数定义在以上两行代码间时,才能被ClassWizard识别和处理。38返回返回4.6 消息映射与消息处理函数2.窗口窗口消息处理函数的实现消息处理函数的实现在实现文件中,消息映射机制写在如下的两行代码间而被ClassWizard识别:/AFX_MSG_MAP(CMyExpView)/ClassWizard标识消/息处理映射机制的起始代码/AFX_MSG_MAP/ClassWizard标识消息处理/映射机制的结束代
40、码同样,AFX_MSG_MAP括号中的内容是拥用消息映射机制的类的名称,只有当一个消息处理函数的消息映射机制写在以上两行代码间时,才能被ClassWizard识别和处理。39返回返回4.6 消息映射与消息处理函数4.6.2.4 删除窗口消息处理函数删除窗口消息处理函数用ClassWizard删除窗口消息处理函数的方法很简单:在操作界面中,从【MemberFunctions】列表框中选择刚刚增加的OnLButtonDown函数,这时【DeleteFuntion】按钮处于激活可执状态,单击此按钮,系统会提示是否对OnLButtonDown函数进行删除,并提示必须用手工从实现文件中删除函数的实际代码,确认后就删除了这个消息处理函数。以上操作只是从视图类CMyExpView中删除了函数的定义代码,从实现文件中删除了映射消息机制,而对于实现文件中的函数实现代码,需要手工进行删除。这样做的目的是避免误操作而删除大量有用的代码。40返回返回本章小结本章小结41返回返回习题习题42