利用 mfc 开发 windows 应用程序

38
1 返返 利利 MFC 利利 Windows 利利利利 返返返返 利利 MFC 利利利利利利利利 Windows 利利利利利利利利利利利利利利利利利利利 利利利利 Windows 利利利利利利利利利利利利利利利利利 利利利 、、 利利利利利利利利利利利利利利利利利利利利利利 利利利利利利利利利利利利利利利利利 、。 利利利利 Class Wizard 利利 利利利利利利利利利利利利利利利利利利 利利利利利利利利利利利利利利利利 ,。

Upload: jeremy-butler

Post on 02-Jan-2016

378 views

Category:

Documents


0 download

DESCRIPTION

利用 MFC 开发 Windows 应用程序. 本章导读 理解 MFC 的概念和作用。 理解 Windows 应用程序的特点和运行机制。 理解消息的概念,掌握编写 Windows 应用程序过程中所涉及到的消息的种类、特点、消息的发送和接收的基本过程和机制。 掌握消息映射、消息处理函数的概念及二者间的关系。 掌握利用 Class Wizard 增加、修改和删除窗口消息处理函数的方法和步骤,并理解程序代码的变化过程和特点。. 4.1 Windows 应用程序的特点与消息驱动机制. 基于 Windows 操作系统的应用程序的特点是: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 利用 MFC 开发 Windows 应用程序

1返回返回

利用 MFC 开发 Windows 应用程序本章导读 理解 MFC 的概念和作用。 理解 Windows 应用程序的特点和运行机制。理解消息的概念,掌握编写 Windows 应用程序过程中所

涉及到的消息的种类、特点、消息的发送和接收的基本过程和机制。 掌握消息映射、消息处理函数的概念及二者间的关系。 掌握利用 Class Wizard 增加、修改和删除窗口消息处

理函数的方法和步骤,并理解程序代码的变化过程和特点。

Page 2: 利用 MFC 开发 Windows 应用程序

2返回返回

4.1 Windows 应用程序的特点与消息驱动机制基于 Windows 操作系统的应用程序的特点是: 标准的图形用户界面,比如窗口、菜单、按钮、列

表框等; 应用程序与硬件无关的特性,对于同一类硬件,不

论厂家、型号,程序都无需进行任何修改就可以运行; 所有的 Windows 应用程序都是消息驱动机制,也就

是说 Windows 程序是通过操作系统发送的消息来处理用户的输入的。 在进行 Windows 编程之前,必须了解 Windows 的运行机制。在 Windows 操作系统中,无论是系统产生的动作或是用户运行应用程序产生的动作都称为事件 (Events) 产生的消息 (Message) 。 无论是 Windows 应用程序的设计、还是它的应用,都是基于消息驱动方式的,这是 Windows 应用程序与传统的应

Page 3: 利用 MFC 开发 Windows 应用程序

3返回返回

用程序最大的区别。在传统的编程方式中,程序是主动的。程序主动执行,只有当需要用户通过键盘或鼠标输入信息时,才进行查询或等待。获得输入后,程序继续运行。Windows 应用程序是被动的,正常情况下,只是等待被消息触发。当用户点击鼠标或按下了键盘,则由操作系统将这些操作转化为特殊的消息,传递给应用程序,应用程序再用对应的消息处理过程进行处理,处理完毕后,继续等待下一个消息。

4.1 Windows 应用程序的特点与消息驱动机制

Page 4: 利用 MFC 开发 Windows 应用程序

4返回返回

4.3 MFC 应用程序的类和文件4.3.1 类说明 OcafMainFrame : 主框架窗口类 OcafApp : 应用程序类 OcafDoc : 文档类 Occ_3dView :视图类 在工程中,每个类都拥有自己的类定义文件( *.H )和类实现文件( *.CPP )。类定义文件主要保存各种类的定义;类实现文件主要保存各种类的成员函数的实现代码。

Page 5: 利用 MFC 开发 Windows 应用程序

5返回返回

下面分别对这 5 个类进行说明:

• 主框架窗口类 CMainFrame

OcafMainFrame 是工程 MyExp 的主框架窗口类,它的基类是 OCC_MainFrame 。 主框架窗口类用于管理主程序的窗口,来显示窗口的标题栏、工具栏、状态栏等;同时还处理对窗口操作的消息,例如窗口最大化、最小化、改变窗口大小等一般操作。视图窗口是主框架窗口的子集,对于多文档界面( MDI )应用程序,主框架窗口是所有 MDI 子窗口的容器。

4.3 MFC 应用程序的类和文件

Page 6: 利用 MFC 开发 Windows 应用程序

6返回返回

应用程序类 OCAFApp

COcafApp 是工程的应用程序类,它的基类是 OCC_3dApp 。 应用程序类管理程序的整体,控制应用程序的所有对象,包括文档、视图和边框窗口,并完成应用程序的初始化工作和程序退出时的清除工作。 注意:每个基于 MFC 的应用程序都必须有一个从 CWinApp 类派生的对象。 文档类 COcafDoc

COcafDoc 是工程的文档类,它的基类是 OCC_3dDoc(Cdocument) 。

4.3 MFC 应用程序的类和文件

Page 7: 利用 MFC 开发 Windows 应用程序

7返回返回

文档类负责存放程序的数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。文档类必须通过视图类实现与用户的交互。 视图类 OCC_3dView

OCC_3dView 是工程的视图类,它的基类是 OCC_BaseView(Cview) 。 视图类主要负责管理视图窗口,显示文档类中的数据,可以显示在屏幕上,也可以输出到打印机或其他设备上;也负责处理用户数据,接受用户对数据的鼠标、键盘操作并传送给文档类对象。

4.3 MFC 应用程序的类和文件

Page 8: 利用 MFC 开发 Windows 应用程序

8返回返回

4.3 MFC 应用程序的类和文件4.3.2 文件说明 App Wizard 在自动生成工程时,除了生成上面介绍的各个类的头文件和实现文件外,还生成了一些为建立应用程序所需要的其他文件。下面分别对这些文件加以说明:1..clw : Class Wizard 的信息存储文件,存储由 Class Wizard 编辑已有的类或添加新类的信息,存储由 Class Wizard建立和编辑各种消息处理函数和映射变量等的信息。2..dsp : Project 文件,即工程文件。 Project 文件中保存着工程的各种信息,一个工程文件对应一个工程应用程序。

Page 9: 利用 MFC 开发 Windows 应用程序

9返回返回

3. .dsw : Workspace 文件。一个 Workspace 文件可包含一个或多个工程。 4. .rc :资源定义文件,包含程序资源的定义,其中保存了应用程序中使用到的各种资源的信息,包括存贮在文件夹中的图标、位图和光标等。 5. Resource.h :标准的头文件,它包含了所有资源符号的定义,与 MyExp.rc 文件相对应。6. StdAfx.h :包含在所有 App Wizard 程序中的标准头文件,它用于包含其他包含在预编译头文件中文件。7. StdAfx.cpp :包含在所有 App Wizard 程序中,它包含所有标准 include 文件。

4.3 MFC 应用程序的类和文件

Page 10: 利用 MFC 开发 Windows 应用程序

10返回返回

9. res\.rc2 :资源定义文件,包含了用 vc 不能直接编辑的资源。可以将所有不能由资源编辑器编辑的资源放置到这个文件中。10. res\.ico :应用程序的图标文件。应用程序图标包含在资源文件中。 11. res\Toolbar.bmp :用于创建工具栏按钮的位图文件。初始栏工具栏和状态栏是在主边框窗口类中构造的。

4.3 MFC 应用程序的类和文件

Page 11: 利用 MFC 开发 Windows 应用程序

11返回返回

Windows 应用程序一般是由消息驱动的( message-driven ),这也是 Windows 编程方式与其他编程方式最大的不同之处。 消息就是操作系统通知应用程序某件事情已经发生的一种方式。例如,当用户移动或双击鼠标、改变窗口大小等,都将向适当的窗口发送消息,一个窗口可以向另一个窗口发送消息,并且大多数窗口通过向其他窗口发送一个稍有不同的消息来响应消息。  Windows 系统中的消息主要有三种类型: 标准的 Windows 消息 控件消息 命令消息。

4.4 Windows 消息

Page 12: 利用 MFC 开发 Windows 应用程序

12返回返回

4.4 Windows 消息4.4.1 标准的 Windows 消息 所有以 WM_ 为前缀的消息都是标准的 Windows 消息( WM_COMMAND 消息除外),如 WM_PAINT 、WM_QUIT 等,这些消息通常含有用于确定如何对消息进行处理的一些参数。标准的 Windows 消息一般由窗口对象和视图对象进行处理。窗口对象指的是从 CWnd中派生出的类的对象,如从 CWnd 、 CFrameWnd 、 CMDIFrameWnd 、 CMDIChildWnd 、 Cview 、 Cdialog等 MFC 类或这些类的派生类定义的对象(这些类都是CWnd 类直接或间接派生的)。

Page 13: 利用 MFC 开发 Windows 应用程序

13返回返回

4.4 Windows 消息 标准的 Windows 消息可以分为三类,即键盘消息、鼠标消息和窗口消息。下面分别加以说明。 键盘消息

当键盘的某个键被按下时,将产生 WM_CHAR 消息,这个消息带有字符代码值、重复次数和先前状态码三个参数。 WM_CHAR 消息的处理函数为 OnChar( ) ,此函数的原型为:afx_msg void Onchar(UINT nChar,UINT nRepCnt,UINT nFlags);

其中: nChar 是所按键的字符代码值; nRepCnt 是重复的次数,它表示用户按键时重复击键的次数; nFlags 表示扫描码、先前键状态和键转换状态等,其参数值功能描述见表 4.1 所示。

Page 14: 利用 MFC 开发 Windows 应用程序

14返回返回

4.4 Windows 消息

位 含 义

0~ 15 指明键重复按下的次数

16~ 23 指定扫描码,依赖于具体厂家的按键值

24 如果同时按下扩展键(如功能键 Alt 、 Ctrl ),则置为 1 ,否则置为 0

25~ 28 由 Windows内部使用

29 若同时按下了 Alt 键,则置为 1 ,否则置为 0

30 指明先前键状态。若消息发出前键是按下的,则置为 1 ,否则置为 0

31 指明键转换状态。若按键已松开,则置为 1 ,否则置为 0

表 4.1 nFlags参数值功能描述

Page 15: 利用 MFC 开发 Windows 应用程序

15返回返回

4.4 Windows 消息鼠标消息

在 Windows 中处理鼠标的操作基本上有三种:1. 单击 (Click) 2. 双击( Double Click ) 3.拖动( Dra

g ) 所有这些鼠标的操作,都会产生相应的消息。鼠标移

动时产生 WM_MOUSEMOVE 消息,鼠标左键按下时产生 WM_LBUTTONDOWN 消息,鼠标右键按下时产生 WM_RBUTTONDOWN 消息,鼠标左键双击时产生 WM_LBOTTONDBLCLK 消息等等。

所有这些鼠标消息的处理函数都有相似的原型,它们都有两个参数。我们以处理鼠标左键按下的消息函数 OnLButtonDown( ) 为例来进行说明。此函数的原型如下:

afx_msg void OnLButtonDown(UINT nFlags,Cpoint point); 其中:参数 point 是鼠标事件发生时鼠标光标所在的位置,

它是相对于窗口左上角的水平坐标和垂直坐标而言的。

Page 16: 利用 MFC 开发 Windows 应用程序

16返回返回

4.4 Windows 消息参数 nFlag指明鼠标按钮的状态以及鼠标事件发生时键盘上某些键的状态,每一状态都可以由 nFlag 的一位来表示。我们可以从表 4.2 中所列的位屏蔽中得到每一位。 4.2 nFlags参数每位的含义

其中, MK_CONTROL 、 MK_LBUTTON 、 MK_MBUTTON 、MK_MBUTTON 、 MK_RBUTTON 和 MK_SHIFT 都是预定义的宏。

位屏蔽 含 义MK_CONTROL Ctrl 键按下时设置MK_LBUTTON 鼠标左键按下时设置MK_MBUTTON 鼠标中间键按下时设置MK_RBUTTON 鼠标右键按下时设置

MK_SHIFT Shift 键按下时设置

Page 17: 利用 MFC 开发 Windows 应用程序

17返回返回

4.4 Windows 消息 窗口消息

所有窗口的变化,包括窗口内容重绘WM_PAINT 、窗口最大化 WM_MAXIMIZE 、窗口最小化 WM_MINIMIZE 、窗口重定义大小 WM_RESIZE 、窗口滚动 WM_HSCROLL 、 WM_VSCROLL 、窗口定时 WM_TIMER 等消息所带参数各不相同。 在这里我们来详细讨论一下 WM_PAINT 消息。当调用成员函数 UpdateWindow( ) 或 RedrawWindow( ) 要求重新绘制窗口内容时,应用程序将收到 WM_PAINT 消息。当窗口最小化后再还原或被其他窗口遮盖后又重新显示时,则当前窗口中的内容必须重新绘制,消息 WM_PAINT 就是为实现这个功能的。

Page 18: 利用 MFC 开发 Windows 应用程序

18返回返回

4.4 Windows 消息当向 Windows 应用程序发送 WM_PAINT 消息,应用程序检索到此消息后,就重新显示窗口中的内容。 WM_PAINT 消息的处理函数为 OnPaint( ) 。函数原型为:afx_msg void OnPaint( ); 如果想详细了解所有的标准的 Windows 消息,可以参阅 Visual C++ 6.0联机帮助中的有关内容。4.4.2 控件消息 控件是一个小的子窗口,属于其他窗口(如对话框等),能够接受操作并象父窗口发送消息。常见的控件有按钮、列表框、编辑框、复合框、滚动条等。 在 Visual C++ 6.0 中,对控件的操作都是通过生成相应的控件类来进行。这些控件类仅能发送少量特定的消息,这些消息就叫做控件消息。发送控件消息的控件在 Visual C++ 中

Page 19: 利用 MFC 开发 Windows 应用程序

19返回返回

4.4 Windows 消息使用唯一 ID 号来进行标识,使用控件类来操纵。控件消息分为两类:1. 从控件传给消息,通常这类消息的前缀的最后一个字符为 N ;2. 由系统发送给控件的消息,这类消息的前缀的最后一个字符为 M 。 例如,当用户对编辑框中的文本进行修改时,编辑框将发送给父窗口一条包含控件通知码 EN_CHANGE 的WM_COMMAND 消息。窗口的消息处理函数将以某种适当的方式对通知消息作出响应,如检索编辑框中的文本。 与其他标准的 Windows 消息一样,控件消息也是由窗口对象和视图对象进行处理。

Page 20: 利用 MFC 开发 Windows 应用程序

20返回返回

4.4 Windows 消息4.4.3 命令消息 命令消息主要包括由用户界面对象发送的 M_COMMAND 消息,用户界面对象是指菜单、工具栏、快捷键等。它和控件消息的区别在于:控件消息只能由特定控件向Windows 系统传送,而命令消息是由用户界面发送的,它可以被更多的对象处理。在文档对象、视图对象、窗体对象、控件对象中都能处理这种消息。1. 用户界面对象 菜单、工具栏、快捷键等都是可以产生命令的用户界面对象。每个这样的对象都分配了一个 ID 号,通过给对象和命令分配同一个 ID 号,将用户界面对象和命令联系在一起。例如,选择程序中的【文件】菜单下的【打开】菜单项,则产生一条 ID_FILE_OPEN命令,然后通过消息映射调用函数 OnFileOpen ()来进行处理。

Page 21: 利用 MFC 开发 Windows 应用程序

21返回返回

4.4 Windows 消息2. 命令 ID

在 MFC 编程中,命令完全由命令 ID 来进行描述,命令 ID 分配给产生此命令的用户界面对象。通常情况下,命令 ID 是由它所表示的用户界面对象的功能来命名的。MFC预定义了一些命令 ID ,如 ID_EDIT_CUT 、 ID_FILE_SAVE 等,而其他命令 ID 则要由编程人员自己定义。3. 命令目标 当用户界面对象被单击后,将调用处理函数来执行所产生的命令。 Windows把非命令消息的消息直接发送给窗口,窗口中用于处理这些消息的处理函数将被调用。而对于命令消息,将把命令发送给多个目标,也就是命令目标,其中通常有一个要调用此命令的处理函数。

Page 22: 利用 MFC 开发 Windows 应用程序

22返回返回

4.5 消息的发送和接收的基本过程和机制 在 Windows 中,大部分的消息都是由用户和应用程序的相互作用而产生的。 CWinApp 类的成员函数 Run( ) 用于处理消息循环,它唯一的功能就是等待消息,并将消息发送到适当的窗口。 当消息循环接收到一条Windows 消息时,它首先通过查询一种内部结构来确定消息要发送的窗口。这种内部结构把当前所有的窗口映像成其对应的窗口类。 MFC 的基类还能够检测这一目标类是否在其消息中为这一消息提供了处理函数入口。如果找到入口,则消息被送往处理函数,结束消息发送过程。如果消息无对应入口,则对目标类进行基类消息映射检测,沿着层次向上查找,直到找到入口函数为止。 对于命令消息来说,查找较为复杂。通常,每个命令目标类先把命令发送给某些其他的对象,使其他对象有

Page 23: 利用 MFC 开发 Windows 应用程序

23返回返回

4.5 消息的发送和接收的基本过程和机制优先处理的机会。如果这些对象都不能处理此命令,则起始类检查自己的消息映射,若也不能处理此消息,则将命令发送给更多的命令目标。在大多数情况下,命令目标将以下列顺序发送命令:1. 发送至当前活动的子命令目标对象;2. 发送至其本身;3. 发送至其他命令目标。【例】在一个 MDI 应用程序中,如果选择了“文件”菜单中的“保存”菜单项,则产生一条命令消息。我们假定命令处理函数是应用程序文档类的成员函数,则此命令的发送顺序为:

Page 24: 利用 MFC 开发 Windows 应用程序

24返回返回

4.5 消息的发送和接收的基本过程和机制1. 命令消息首先传给主框架窗口;2. 主框架窗口给当前活动的子窗口处理此命令的机会; 3. 视图检查其消息映射,若没有找到处理函数,再把此命令发送给与其相连的文档; 4. 文档检查其消息映射,如果找到命令的处理函数,则调用此函数,发送过程结束,否则继续下面的步骤;5. 将命令发送给文档模板,然后返回到视图,再返回边框窗口,边框窗口检查其消息映射;6. 命令回送到主边框窗口,主边框窗口检查自己的消息映射;7. 检测应用程序的消息映射,进到消息入口,并调用适当的处理程序。

Page 25: 利用 MFC 开发 Windows 应用程序

25返回返回

4.6 消息映射与消息处理函数4.6.1 消息映射与消息处理函数的概念通过消息映射,消息就和它的处理函数对应起来。 消息处理函数指的是与某个消息对应的函数。消息处理函数的执行是由其对应的消息引发的,某个类对象中的消息处理函数是与这个类对象能够得到的一个消息对应的,当这个消息发生时,这个函数就会被执行。 消息处理函数的定义与使用方法与类的一般的成员函数不同。一般成员函数包括两部分:函数的定义部分和函数的实现部分;而消息处理函数除了这两部分以外,还有消息映射部分。

Page 26: 利用 MFC 开发 Windows 应用程序

26返回返回

4.6 消息映射与消息处理函数4.6.2 管理窗口消息处理函数 利用 Class Wizard 可以管理消息处理函数, Class Wizard 是一个非常强大有用的工具,我们可以用 Class Wizard 来创建新类、定义消息处理函数、覆盖MFC 的虚拟函数,从对话框、表单视图或记录视图的控件中获取数据。可以用三种方法来激活 Class Wizard 对话框:1. 选择【 View】菜单中的【 Class Wizard】菜单项;2. 直接按下 Ctrl+W 键;3. 在代码编辑窗口中单击鼠标右键(此时,代码编辑窗口中必须有打开的文件),在弹出菜单中选择【 Class Wizard】菜单项。

Page 27: 利用 MFC 开发 Windows 应用程序

27返回返回

4.6 消息映射与消息处理函数 当执行了以上操作,窗口中将弹出【MFC Class Wizard】对话框。此时显示的是【Message Map】选项卡。在这个选项卡的最上面有两个下拉列表框:【 Project】列表中显示的是当前的项目名称,【 Class name】列表中显示的是正在编辑的消息映射所属的类名。选项卡的中间也有两个多行的列表框。左边的【 Object IDs】列表框中显示的对象有三种类型:在【 Class name】栏中列出的类名、菜单项对象和其他可能在【 Class name】中所选的类传递消息的控件,当其中的某一个类被选中时,右面的 【Messages 】列表框就显示出此类的能捕获的所有 Windows 消息。其中还列出了一些能够捕获的普通消息的虚函数。最下面【Member functions】列表中显示的是与此消息相关的类的成员函数的列表。

Page 28: 利用 MFC 开发 Windows 应用程序

28返回返回

4.6 消息映射与消息处理函数 在【 MFC Class Wizard】对话框中共有五个选项卡,分别说明如下:1. 【 Message Maps】选项卡 用于进行消息映射的处理;2. 【Member Variables】选项卡 用于为对话框中的控件所用到的类创建成员变量;3. 【 Automation】选项卡 帮助用户管理与 OLE 自动化相联系的方法和属性;4. 【 ActiveX Events】选项卡 帮助用户管理 ActiveX 类支持的 ActiveX 事件;5. 【 Class Info】选项卡 显示类的一般信息,包括定义它的头文件和源文件、类名以及与之相联系的基类。

Page 29: 利用 MFC 开发 Windows 应用程序

29返回返回

4.6 消息映射与消息处理函数4.6.2.1 增加一个窗口消息 以应用程序 MyExp 为例,说明用 Class Wizard 增加一个窗口消息处理函数的过程。1. 在 VC++ 工作界面下打开 MyExp项目,并启动 Class Wizard ,进入对话框界面。2. 从【 Class Name】复合框中选择视图类 CMyExpView, 在【 Object IDs】列表框中就会列出各种消息来源的组件。3. 从【 Object IDs】列表框中选择 CMyExpView ,在列表框【 Message】中列出的就是 CMyExpView 类对象能够从窗口对象 CWnd 接受到的窗口消息和各种可重载的虚函数。从中可以找到名为 WM_LBUTTONDOWN 的消息,用鼠标选中这个消息。

Page 30: 利用 MFC 开发 Windows 应用程序

30返回返回

4.6 消息映射与消息处理函数4. 此时,【 Add Function】按钮处于可执行状态,单击此按钮,就会在 CMyExpView 类中增加一个被 CWnd保护的消息处理函数 OnLButtonDown 。

5. 在【Member functions】列表框中能够发现这个函数及其对应的消息映射机制: OnLButtonDown ON_WM_LBUTTONDOWN 。在函数前有一个“W“ 标志,表示这个函数是一个窗口消息处理函数。

6. 单击【 OK】按钮,完成一个窗口消息处理函数的增加。

4.6.2.2 增加窗口消息处理函数的过程的分析 以上介绍了用 Class Wizard 增加一个窗口消

息处理函数的过程,增加了该函数后,对于应用程序MyExp 的代码做了如下的修改:

Page 31: 利用 MFC 开发 Windows 应用程序

31返回返回

4.6 消息映射与消息处理函数1. 在视图类 CMyExpView 中,增加了消息处理函数的定义代码://省略以上代码 protected:

//{{AFX_MSG(CMyExpView)

afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // 单击鼠标左键调用 //}}AFX_MSG

DECLARE_MESSAGE_MAP()

//省略以下代码

Page 32: 利用 MFC 开发 Windows 应用程序

32返回返回

4.6 消息映射与消息处理函数2. 在 CMyExpView 类的实现文件 MyExpview.cpp 中,增加了函数的实际代码:void CMyExpView::OnLButtonDown(UINT nFlags, CPoint point)

{

//TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

}

3. 在实现文件 MyExpView.cpp 中,还增加了函数的消息映射机制: BEGIN_MESSAGE_MAP(CMyExpView, CView)

//{{AFX_MSG_MAP(CMyExpView)

Page 33: 利用 MFC 开发 Windows 应用程序

33返回返回

4.6 消息映射与消息处理函数ON_WM_LBUTTONDOWN() // 单击鼠标左键, //OnLButtonDown 函数的消息映射 //}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT,view::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW,

CView::OnFilePrintPreview)

END_MESSAGE_MAP()

Page 34: 利用 MFC 开发 Windows 应用程序

34返回返回

4.6 消息映射与消息处理函数4.6.2.3 Class Wizard 识别和处理窗口消息处理函数所需要的标识1. 窗口消息处理函数的定义 在类的定义文件中, Class Wizard 通过以下两行固定的代码来标识消息处理函数: //{{AFX_MSG(CMyExpView) //Class Wizard 标识消息 // 处理函数定义的起始代码//}}AFX_MSG //Class Wizard 标识消息处理函数定义 // 的结束代码 AFX_MSG 括号中的内容 (CMyExpView) 是消息处理函数所在类的名称,只有将消息处理函数定义在以上两行代码间时,才能被 Class Wizard识别和处理。

Page 35: 利用 MFC 开发 Windows 应用程序

35返回返回

4.6 消息映射与消息处理函数2. 窗口消息处理函数的实现在实现文件中,消息映射机制写在如下的两行代码间而被 ClassWizard识别: //{{AFX_MSG_MAP(CMyExpView) //Class Wizard 标识消 // 息处理映射机制的起始代码//}}AFX_MSG_MAP //Class Wizard 标识消息处理 // 映射机制的结束代码 同样, AFX_MSG_MAP 括号中的内容是拥用消息映射机制的类的名称,只有当一个消息处理函数的消息映射机制写在以上两行代码间时,才能被 Class Wizard 识别和处理。

Page 36: 利用 MFC 开发 Windows 应用程序

36返回返回

4.6 消息映射与消息处理函数 4.6.2.4 删除窗口消息处理函数 用 Class Wizard 删除窗口消息处理函数的方法很简单:在操作界面中,从【 Member Functions】列表框中选择刚刚增加的 OnLButtonDown 函数,这时【 Delete Funtion】按钮处于激活可执状态,单击此按钮,系统会提示是否对 OnLButtonDown 函数进行删除,并提示必须用手工从实现文件中删除函数的实际代码,确认后就删除了这个消息处理函数。 以上操作只是从视图类 CMyExpView 中删除了函数的定义代码,从实现文件中删除了映射消息机制,而对于实现文件中的函数实现代码,需要手工进行删除。这样做的目的是避免误操作而删除大量有用的代码。

Page 37: 利用 MFC 开发 Windows 应用程序

37返回返回

本章小结

Page 38: 利用 MFC 开发 Windows 应用程序

38返回返回

习题