1、子任务子任务1 1:简单:简单MFCMFC应用程序设计应用程序设计 2.1 Windows应用程序概述 2.2 MFC应用程序框架 2.3 消息映射与消息处理 2.4 程序调试 2.5 应用实例Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 22.1 Windows应用程序概述应用程序概述 WindowsWindows应用程序运行于应用程序运行于WindowsWindows操作系统上,操作系统上,与与DOSDOS应用程序有着本质的区别。应用程序有着本质的区别。所有的所有的WindowsWindows应用程序都是由应用程序都是由消息驱动
2、消息驱动的,的,消消息处理是所有息处理是所有WindowsWindows应用程序的核心。应用程序的核心。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 32.1.1 2.1.1 窗口窗口 窗口是用户界面中窗口是用户界面中最最重要的部分。它是屏幕重要的部分。它是屏幕上与一个应用程序相对应的矩形区域,是上与一个应用程序相对应的矩形区域,是用户与用户与产生该窗口的应用程序之间的可视界面产生该窗口的应用程序之间的可视界面。标题栏 菜单栏 编辑区 垂直滚动条 水平滚动条 最小化按钮 最大化按钮 关闭按钮 Visual C+程序设计与应用教程20
3、22/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 4 窗口是由应用程序创建的一个用于窗口是由应用程序创建的一个用于接收接收用户输入和用户输入和显示显示输输出的矩形区域出的矩形区域。是系统管理应用程序的基本单位。是系统管理应用程序的基本单位。窗口由窗口由“非客户区非客户区”和和“客户区客户区”组成。组成。非客户区非客户区由由系统系统绘制,包括菜单、工具栏、最大化按钮绘制,包括菜单、工具栏、最大化按钮等。等。客户区客户区由由应用程序应用程序绘制,用于输出数据和接受用户的输绘制,用于输出数据和接受用户的输入。入。当用户启动一个程序时,一个窗口就创建了。用户每次单击窗口,应用程序就会
4、作出响应,关闭一个窗口会使应用程序结束。编写一个编写一个Windows应用程序应用程序首先首先应创建一个或多个窗口,应创建一个或多个窗口,随后随后应用程序的运行过程即是窗口内部、窗口与窗口之间、应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行窗口与系统之间进行数据处理与数据交换数据处理与数据交换的过程。的过程。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 52.1.2 消息和事件消息和事件 Windows是一个基于事件的消息驱动系统,是一个基于事件的消息驱动系统,Windows应用程序是按照应用程序是按照“事件事件
5、消息消息处理处理”非顺序非顺序的机制运行的。的机制运行的。所谓所谓消息消息,就是用于,就是用于,而,而事件事件是是对于对于Windows的某种操作的某种操作。事件事件是是因因,消息消息是是果果,事件事件产生产生消息,消息消息,消息对应对应事件。事件。所谓所谓消息的处理消息的处理,其实质就是,其实质就是事件的处理事件的处理。当有某。当有某个个事件事件(如单击鼠标、键盘输入和执行菜单命令等如单击鼠标、键盘输入和执行菜单命令等)发生发生时,时,Windows会根据具体的事件会根据具体的事件产生产生对应的对应的消息消息,并发送到,并发送到指定应用程序的指定应用程序的消息队列消息队列。应用程序从消息队列
6、中。应用程序从消息队列中取出消取出消息息,并根据不同的消息进行,并根据不同的消息进行不同的处理不同的处理。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 6初始化应用程序初始化并创建应用程序窗口进入消息循环并获取消息是否是WM_QUIT消息是否是应用程序处理的消息输入消息系统消息消息处理函数开始默认处理函数结束windows应用程序的执行过程YNNYVisual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 72.1.3 基本数据类型基本数据类型 Windows编程中常用的编程中常用的基
7、本数据类型基本数据类型的的别名别名。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 8Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 92.1.4 句柄句柄 句柄是句柄是Windows编程的基础,所谓编程的基础,所谓句柄句柄就是就是Windows使用的一种无重复整数使用的一种无重复整数。句柄句柄主要用来主要用来标识应用程序中的一个对象标识应用程序中的一个对象,如窗口、,如窗口、实例、菜单、内存、输出设备、控制或文件等。实例、菜单、内存、输出设备、控制或文件等。WINDOWS应
8、用程序应用程序只能访问句柄,不能直接访问句只能访问句柄,不能直接访问句柄所指的实际数据。柄所指的实际数据。(1)句柄是一个 4 字节的整数,Windows 利用它标识应用程序创建和使用的资源,包括应用程序实例、窗口、菜单、控件、内存、外设、文件以及与图形相关的画笔、刷子等.(2)句柄是 Windows 内部表资源数据存储的内存索引值,Windows 利用它可以访问表中的信息。通常,在程序中要访问某个资源时,需要提供该资源的句柄,因此,句柄可理解为是内存的索引值。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 10 Windows常见的
9、公用句柄类型如下表所示:常见的公用句柄类型如下表所示:Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 11由于对应的由于对应的MFCMFC类已对句柄进行类已对句柄进行了了封装封装,大多数,大多数情况下不再需要情况下不再需要访问句柄。访问句柄。句柄是消息与API函数的参数,采用MFC编写应用程序时,可以通过访问类的一个public的成员变量来得到某个对象的句柄。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 122.2 MFC2.2 MFC应用程序框架应用程序框架 下面通过一个
10、实例介绍利用下面通过一个实例介绍利用MFC AppWizardexe创建应用程序框架的步骤。创建应用程序框架的步骤。2.2.1 创建创建MFC应用程序框架应用程序框架 Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 13【例例2.12.1】编写一个编写一个SDISDI单文档应用程序单文档应用程序Li2_1Li2_1,程序运行后,程序运行后,通过消息框输出通过消息框输出“这是一个单文档应用程序!这是一个单文档应用程序!”的提示信息。的提示信息。(1)选择File菜单下的New菜单项,系统弹出New对话框。单击单击输入输入工程名保存文件路
11、径默认默认Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 14 单文档单文档界面界面(SDI)(SDI)应用应用程序。应用程序运行时,程序。应用程序运行时,只能打开只能打开一一个文档。个文档。多文档多文档界面界面(MDI)(MDI)应用应用程序。应用程序可以同程序。应用程序可以同时打开时打开多多个文档。个文档。基于对话框基于对话框的应用程序。的应用程序。应用程序将显示一个简应用程序将显示一个简单的对话框来处理用户单的对话框来处理用户的输入,的输入,(2)MFC AppWizard-Step 1(2)MFC AppWizard-Step
12、 1对话框主要用于选择应用程序对话框主要用于选择应用程序类型。类型。AppWizardAppWizard可以创建可以创建3 3种种类型的应用程序框架。类型的应用程序框架。语言种类语言种类是否支持是否支持文档文档/视图视图结构结构Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 15(3)MFC AppWizard-Step 2 of 6(3)MFC AppWizard-Step 2 of 6对话框中主要用于选择对话框中主要用于选择应用程序所支持应用程序所支持数据库数据库方式。方式。不不包含任何数据库支持包含任何数据库支持包含包含最低限度
13、最低限度的数据库的数据库支持支持创建对应表的一个创建对应表的一个数据数据库类库类和一个和一个视图类视图类,不,不附加标准文件支持附加标准文件支持创建对应表的一个数据创建对应表的一个数据库类和一个视图类,并库类和一个视图类,并附加附加标准文件支持标准文件支持Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 16(4)(4)在在MFC AppWizard-Step 3 of 6MFC AppWizard-Step 3 of 6对话框中选择对话框中选择应用程应用程序所支持的序所支持的复合文档复合文档类型类型。不不支持任何复合文档支持任何复合文
14、档应用程序作为复合文档容器,包含应用程序作为复合文档容器,包含可以链接或嵌入的可以链接或嵌入的ActiveXActiveX对象对象应用程序仅仅可以创建能够嵌入到应用程序仅仅可以创建能够嵌入到其他应用程序中的文档,但是不能其他应用程序中的文档,但是不能作为一个单独运行的应用程序作为一个单独运行的应用程序应用程序可以单独运行,同时也可应用程序可以单独运行,同时也可以作为一个对象嵌入到其他应用程以作为一个对象嵌入到其他应用程序中序中应用程序能够作为容器包含嵌入或应用程序能够作为容器包含嵌入或链接的链接的ActiveXActiveX对象,同时也能够对象,同时也能够作为一个可以嵌入到其他程序中的作为一个
15、可以嵌入到其他程序中的对象对象Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 17(5)(5)在在MFC AppWizard-Step 4 of 6MFC AppWizard-Step 4 of 6对话框中设置应用程对话框中设置应用程序的序的外观外观特征。特征。添加添加工具栏工具栏自动生成自动生成状态栏状态栏添加添加打印和打印预览打印和打印预览菜单项菜单项在帮助菜单中自动在帮助菜单中自动添加索引和添加索引和使用帮助使用帮助菜单项菜单项使应用程序的外观呈使应用程序的外观呈三维三维显示显示消息应用程序接口消息应用程序接口应用程序具有应用程
16、序具有TCP/IPTCP/IP通信功能通信功能传统风格工具条传统风格工具条Internet ExplorerInternet Explorer风格工具条风格工具条Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 18(6)(6)在在MFC AppWizard-Step 5 of 6MFC AppWizard-Step 5 of 6对话框中设置应用程序对话框中设置应用程序的的风格风格。创建创建标准标准的的MFCMFC应用程序应用程序创建类似于创建类似于WindowsWindows资源管资源管理器理器风格的应用程序风格的应用程序在生成的程序
17、框架的源文在生成的程序框架的源文件中件中加入注释加入注释不加不加入注释信息入注释信息使用使用动态链接库动态链接库 使用使用静态链接库静态链接库 Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 19(7)(7)在在MFC AppWizard-Step 6 of 6MFC AppWizard-Step 6 of 6对话框中,可以设对话框中,可以设置向导生成的置向导生成的文件名文件名和和类名类名。设置类名设置类名设置文件名设置文件名Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 2
18、0(8)(8)打开项目工作区中的打开项目工作区中的ClassViewClassView类视图,单击类视图,单击CLi2_1ViewCLi2_1View类类左边的左边的“+”+”展开视图类,双击打开展开视图类,双击打开OnDrawOnDraw()()函数,并添加代码。函数,并添加代码。void CLi2_1View:OnDraw(CDC*pDC)CLi2_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereMessageBox(这是一个单文档应用程序!这是一个单文档应用程序!,消息框
19、消息框,MB_ICONEXCLAMATION|MB_OKCANCEL);Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 21(9)(9)选择选择BuildBuild菜单中的菜单中的Build Li2_1.exeBuild Li2_1.exe菜单项,对工菜单项,对工程进行编译和链接,生成可执行文件。再选择程进行编译和链接,生成可执行文件。再选择BuildBuild菜菜单中的单中的Execute Li2_1.exeExecute Li2_1.exe菜单命令运行程序。菜单命令运行程序。Visual C+程序设计与应用教程2022/7/21任
20、务单元二任务单元二 :MFCMFC编程基础编程基础 22MFCMFC应用程序框架结构类的继承关系:应用程序框架结构类的继承关系:2.2.2 MFC应用程序框架结构类应用程序框架结构类CCmdTargetCWinThreadCWndCDocumentCDocTemplateCWinAppCViewCFrameWndCMDIChildWndCMDIFrameWndCSingleDocTemplateCMultiDocTemplateCObject 根类命令相关类应用程序类窗口类文档类视图类框架窗口类线程基类Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编
21、程基础编程基础 231.C1.CObjectObject类类 CObjectCObject是是MFCMFC类库的类库的根类根类,它几乎描述了所有,它几乎描述了所有MFCMFC类的一些公共特性,并且给所有由它派生出的类类的一些公共特性,并且给所有由它派生出的类提供了提供了3 3种重要特性种重要特性,即:即:串行化支持串行化支持、运行时类信运行时类信息支持息支持以及以及诊断和调试支持诊断和调试支持。2.C2.CCmdTargetCmdTarget类类 命令类命令类CCmdTargetCCmdTarget是是CObjectCObject的子类的子类,它是,它是MFCMFC库中所有库中所有具有消息映射
22、属性的类具有消息映射属性的类的公共基类。从的公共基类。从CCmdTargetCCmdTarget派生的类能在程序运行时动态创建对象派生的类能在程序运行时动态创建对象和处理命令消息。和处理命令消息。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 243.CWinApp3.CWinApp类类 应用程序类应用程序类CWinAppCWinApp是是CWinThreadCWinThread的子类,的子类,封装了封装了初始化、运行、终止应用程序的代码初始化、运行、终止应用程序的代码。可以由此派生自。可以由此派生自己的应用类。己的应用类。4 4个个
23、成员函数成员函数实现传统的应用程序实现传统的应用程序winMain()的工作。的工作。InitInstance(),应用程序的初始化;创建文档模板、文应用程序的初始化;创建文档模板、文档、视图与主档、视图与主窗口;窗口;Run(),隐藏在基类中隐藏在基类中,发送应用程序的消息到窗口发送应用程序的消息到窗口,保持保持应用程序的正常运行应用程序的正常运行,处理消息循环,处理消息循环;OnIdle():无窗口消息需处理时,被窗口框架调用。无窗口消息需处理时,被窗口框架调用。ExitInstance():退出程序是,被调用。退出程序是,被调用。Visual C+程序设计与应用教程2022/7/21任务
24、单元二任务单元二 :MFCMFC编程基础编程基础 255.CFrameWnd5.CFrameWnd类类 CFrameWndCFrameWnd类是类是CWndCWnd类的派生类类的派生类。它是所有其他。它是所有其他框架窗口框架窗口类的类的基类基类,主要用来管理一个窗口。,主要用来管理一个窗口。CFrameWndCFrameWnd类的对象是一个类的对象是一个框架窗口框架窗口,包括边框、,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。的视图。CFrameWndCFrameWnd类支持单文档界面,对于类支持单文档界面,对于多文档多文档界面
25、,使用它的两个派生类界面,使用它的两个派生类CMDIFrameWndCMDIFrameWnd和和CMDIChildWndCMDIChildWnd。CMDIFrameWndCMDIFrameWnd类用于类用于MDIMDI的的主窗口主窗口,CMDIChildWndCMDIChildWnd类用于类用于MDIMDI的的子窗口子窗口。4.CWnd4.CWnd类类 窗口类窗口类CWndCWnd提供了提供了MFCMFC中所有窗口类的基本中所有窗口类的基本功能功能。从。从CWndCWnd派生的类可以拥有自己的窗口,并派生的类可以拥有自己的窗口,并对它进行控制。对它进行控制。Visual C+程序设计与应用教程
26、2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 266.CView6.CView类类 视图类视图类CViewCView是是CWndCWnd类的子类。视图类及其派类的子类。视图类及其派生类生类用于管理框架窗口的客户区用于管理框架窗口的客户区。7.CDocument7.CDocument类类 文档类文档类CDocumentCDocument负责装载和维护文档负责装载和维护文档。文档。文档包括应用程序的包括应用程序的工作成果工作成果或或环境设置数据环境设置数据等,可等,可以是程序需要保存的任何内容。以是程序需要保存的任何内容。Visual C+程序设计与应用教程2022/7/
27、21任务单元二任务单元二 :MFCMFC编程基础编程基础 27 ,从而构建,从而构建WindowsWindows应用程序的基本框架。应用程序的基本框架。例如,应用程序例如,应用程序Li2_1Li2_1中的类与这些基类的派生关系中的类与这些基类的派生关系:类名称 基 类 说 明 CLi2_1App CMainFrame CLi2_1View CLi2_1Doc CWinApp CFrameWnd CView CDocument 应用程序类 框架窗口类 视图类 文档类 8.CDocTemplate类类 文档模板文档模板类类定义了文档模板的基本功能,它是一个抽象定义了文档模板的基本功能,它是一个抽象
28、类,不能直接使用,只能用其派生类。类,不能直接使用,只能用其派生类。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 28练习Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 291.1.应用程序向导生成的文件应用程序向导生成的文件 下面以例下面以例2.12.1中创建的应用程序中创建的应用程序Li2_1Li2_1为例,介绍为例,介绍MFC MFC AppWizardexeAppWizardexe 向导所生成的各类文件及功能。向导所生成的各类文件及功能。2.2.3 MFC应用程序分
29、析应用程序分析Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 30(1)头文件与实现文件头文件与实现文件 MainFrm.h和和MainFrm.cpp:定义和实现:定义和实现窗口框架窗口框架类类CMainFrame。CLi2_1Doc.h和和CLi2_1Doc.cpp:定义和实现:定义和实现文档文档类类CLi2_1Doc。CLi2_1View.h 和和CLi2_1View.cpp:定义和实现:定义和实现视视图类图类CLi2_1View。CLi2_1.h 和和CLi2_1.cpp:定义和实现:定义和实现应用程序类应用程序类CLi2_1A
30、pp。Resource.h:定义工程中所有:定义工程中所有资源标识符资源标识符,给资源,给资源ID分配一个整数值。分配一个整数值。StdAfx.h和和StdAfx.cpp:用于建立一个:用于建立一个预编译预编译的头的头文件文件CLi2_1.PCH和一个预定义的类型文件和一个预定义的类型文件StdAfx.obj。加速编译过程,一般不修改。加速编译过程,一般不修改。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 31(2)资源文件资源文件Li2_1.rc和和Li2_1.rc2:Li2_1.rc文件是程序所使用的文件是程序所使用的所有所有W
31、indows资源资源的列表。的列表。Li2_1.ico:应用程序的图标所使用的:应用程序的图标所使用的图标图标文件。文件。Li2_1Doc.ico:应用程序的:应用程序的文档图标文档图标文件。文档图文件。文档图标一般显示在多文档程序界面上。标一般显示在多文档程序界面上。Toolbar.bmp:工具栏按钮的:工具栏按钮的位图位图文件。文件。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 32(3)项目工作区文件和工程文件项目工作区文件和工程文件Li2_1.dsw:保存当前:保存当前工作区工作区所包含的工程的信所包含的工程的信息。息。Li
32、2_1.dsp:包含当前工程的设置、工程中的文:包含当前工程的设置、工程中的文件等信息。件等信息。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 33(4)其他文件其他文件 Li2_1.clw:该文件是:该文件是类信息类信息文件。它保存了文件。它保存了ClassWizard编辑现有类或增加新类时需使用的类信编辑现有类或增加新类时需使用的类信息,同时还保存了创建、编辑消息映射和成员函数所息,同时还保存了创建、编辑消息映射和成员函数所需的信息。需的信息。ReadMe.txt:该文件是工程:该文件是工程自述自述文件。主要介绍所文件。主要介绍
33、所创建文件的内容和功能,以及添加用户代码、更改使创建文件的内容和功能,以及添加用户代码、更改使用语言的方法。用语言的方法。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 342.应用程序的运行机制应用程序的运行机制程序开始初始化全局对象theAppCWinApp类构造函数CHelloApp类构造函数AfxWinMain()函数pApp-InitInstance()调用ProcessShellCommand()创建主框架窗口对象、视图对象、文档对象,创建主框架窗口和视图窗口并显示CWinThread:Run()WM_QUIT消 息循 环
34、结束pApp-Run()CHelloApp theAppCWinApp *pApp=AfxGetApp();WinMainpApp-InitApplication();ExitInstance()Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 352.2.应用程序的执行过程应用程序的执行过程 启动启动:创建创建应用程序应用程序对象对象theApptheApp、调用应用程序类的、调用应用程序类的构造构造函数函数初始化对象初始化对象theApptheApp。应用程序框架调用应用程序框架调用MFCMFC提供的提供的AfxWinMainAfx
35、WinMain()()主函数主函数。AfxWinMainAfxWinMain()()主函数,首先通过调用全局函数主函数,首先通过调用全局函数AfxGetAppAfxGetApp()()来获取来获取theApptheApp的的指针指针pApppApp;然后通过该然后通过该指针调用指针调用theApptheApp的成员函数的成员函数InitInstanceInitInstance()()来初始化应用程序。来初始化应用程序。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 36 在应用程序的初始化过程中,同时还构造了在应用程序的初始化过程中,
36、同时还构造了文文档模板,产生最初的文档、视图和主框架窗口,并档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。生成工具栏和状态栏。当当InitInstanceInitInstance()()函数执行完毕后,函数执行完毕后,WinMainWinMain()()函数将调用成员函数函数将调用成员函数 Run()Run(),进入,进入消息处理循环消息处理循环;函数函数Run()Run()收到收到WM_QUITWM_QUIT消息消息。MFCMFC首先调用首先调用CWinAppCWinApp类的成员函数类的成员函数ExitInstanceExitInstance()();然后调用静态对象的析
37、构函数;然后调用静态对象的析构函数;退出应用程序,将控制权交给操作系统。退出应用程序,将控制权交给操作系统。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 37分析例分析例2.12.1中的消息对话框中的消息对话框 一种简单的对话框,用户可以直接调用消息对话框函一种简单的对话框,用户可以直接调用消息对话框函数来使用它,而不需要自己创建。数来使用它,而不需要自己创建。Visual C+Visual C+提供提供三个消息三个消息对话框函数对话框函数,它们的原型为:,它们的原型为:int AfxMessageBox(LPCTSTR lpTex
38、t,UINT nType=MB_OK,UINT nIDHelp=0);int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT nType);int CWnd:MessageBox(LPCTSTR lpText,LPCTSTR lpCaption=NULL,UINT nType=MB_OK);只能用于控件、对话框、窗只能用于控件、对话框、窗口等一些类中。口等一些类中。可以用在可以用在程序的任程序的任意地方意地方Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 38Vis
39、ual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 39Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 402.2.4 文档文档/视图结构视图结构 文档视图体系结构是文档视图体系结构是MFCMFC应用程序框架结构的应用程序框架结构的基石,它定义了基石,它定义了一种程序结构一种程序结构,这种结构利用,这种结构利用文档文档对对象保存应用程序的数据,依靠象保存应用程序的数据,依靠视图视图对象控制视图显示对象控制视图显示数据,数据,文档与视图的关系文档与视图的关系是是一对多一对多的关系,也就是
40、说,的关系,也就是说,文文。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 41 应用程序对象 文档模板对象 文档对象 视图对象 框架窗口对象 Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 422.3 消息映射与消息处理消息映射与消息处理 WindowsWindows消息主要有消息主要有3 3种类型种类型:标准标准WindowsWindows消息、消息、控件消息控件消息和和命令消息命令消息。1 1标准标准WindowsWindows消息消息除除WM_COMMANDWM_CO
41、MMAND以外,所有以以外,所有以“WM_”WM_”为前缀的消为前缀的消息都是标准息都是标准WindowsWindows消息消息;由由窗口类窗口类或或视图类视图类处理处理;都都有默认有默认的处理函数,它们在的处理函数,它们在CWndCWnd类中进行了预类中进行了预定义,默认前缀定义,默认前缀OnOn。如。如:afx_msgafx_msg void void OnCharOnChar();();2.3.1 消息的类别及其描述消息的类别及其描述 消息映射:把消息映射:把消息处理函数消息处理函数与其要处理的与其要处理的消息消息连起来连起来Visual C+程序设计与应用教程2022/7/21任务单元
42、二任务单元二 :MFCMFC编程基础编程基础 43标准的标准的WindowsWindows消息又分为消息又分为3 3类:类:键盘消息、鼠标消息和窗口消息键盘消息、鼠标消息和窗口消息。(1)(1)键盘消息键盘消息 键盘消息与键盘某个键的动作相关联。常见的键键盘消息与键盘某个键的动作相关联。常见的键盘消息有以下几种。盘消息有以下几种。WM_KEYDOWNWM_KEYDOWN、WM_KEYUPWM_KEYUP:按下、释放按下、释放非系统键产生的非系统键产生的消息。消息。WM_CHARWM_CHAR:输入输入非系统字符时产生的消息。非系统字符时产生的消息。如如:afx_msg void OnChar(
43、UINT nChar,UINT nRepCnt,UINT nFlags);Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 44(2)(2)鼠标消息鼠标消息 鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息有以下几种。鼠标消息有以下几种。WM_MOUSEMOVEWM_MOUSEMOVE:鼠标:鼠标移动移动时产生的消息。时产生的消息。WM_RBUTTONDOWNWM_RBUTTONDOWN:鼠标:鼠标右键右键按下时产生的消息。按下时产生的消息。WM_LBUTTONDOWNWM_LBUTT
44、ONDOWN:鼠标:鼠标左键左键按下时产生的消息。按下时产生的消息。WM_LBUTTONDBLCLICKWM_LBUTTONDBLCLICK:鼠标:鼠标双击双击时产生的消息。时产生的消息。如如:afx_msg void OnLButtonDown(UINT nFlags,CPoint point);Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 45(3)(3)窗口消息窗口消息 窗口消息一般与窗口消息一般与创建窗口、绘制窗口、移动窗创建窗口、绘制窗口、移动窗口口和和销毁窗口销毁窗口等动作有关。等动作有关。在在MFCMFC应用程序中,窗
45、口消息是由应用程序中,窗口消息是由视图类、窗视图类、窗口类口类及它们的及它们的派生类派生类处理的。处理的。常见的窗口消息:常见的窗口消息:WM_PAINTWM_PAINT:客户区有移动或显示事件、窗口大小客户区有移动或显示事件、窗口大小改变事件等发送改变事件等发送WM_TIMERWM_TIMER:每当计时器被触发时发送每当计时器被触发时发送Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 462.2.控件消息控件消息 控件消息是指控件消息是指控件或其他控件或其他子窗口子窗口向向父窗口父窗口发送发送的的WM_COMMANDWM_COMMA
46、ND消息。消息。与其他标准的与其他标准的WindowsWindows消息一样消息一样,控件消息也应,控件消息也应该在该在视图类、窗口类视图类、窗口类中进行处理。但是,如果用户中进行处理。但是,如果用户单击按钮控件时,发出的控件通知消息单击按钮控件时,发出的控件通知消息BN_CLICKEDBN_CLICKED将作为命令消息来处理。将作为命令消息来处理。例如:用户向编辑框中的文本进行修改,编辑框将例如:用户向编辑框中的文本进行修改,编辑框将发 送 给发 送 给 父 窗 口父 窗 口 一 条 含 控 件 通 知 码 的一 条 含 控 件 通 知 码 的WM_COMMAND消息。消息。Visual C
47、+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 473.3.命令消息命令消息 命令消息是由命令消息是由菜单项、工具栏按钮、快捷键菜单项、工具栏按钮、快捷键等等用户界面对象发出的用户界面对象发出的WM_COMMANDWM_COMMAND消息。消息。命令消息与其他消息不同命令消息与其他消息不同,它可被更广泛的对,它可被更广泛的对象如文档、文档模板、应用程序对象、窗口和视图象如文档、文档模板、应用程序对象、窗口和视图等处理。等处理。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 482.3.2 M
48、FC消息映射机制消息映射机制 MFCMFC采用采用消息映射消息映射来处理消息;来处理消息;消息映射机制包括一组消息映射机制包括一组消息映射宏消息映射宏,用于把一个,用于把一个WindowsWindows消息消息和和其消息处理函数其消息处理函数联系起来。联系起来。所有从所有从CCmdTargetCCmdTarget类类派生出来的类都能够拥有自派生出来的类都能够拥有自己的消息映射。己的消息映射。与与MFCMFC消息映射机制有关的宏有以下消息映射机制有关的宏有以下3 3个:个:DECLAREDECLARE_MESSAGE_MAP()_MESSAGE_MAP()BEGINBEGIN_MESSAGE_M
49、AP(MyClass_MESSAGE_MAP(MyClass,MybaseClassMybaseClass)ENDEND_MESSAGE_MAP()_MESSAGE_MAP()Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 49为了使用消息映射宏:为了使用消息映射宏:u首先在类定义的首先在类定义的结尾结尾用用DECLARE_MESSAGE_MAP()DECLARE_MESSAGE_MAP()宏来宏来声明声明使用消息映射使用消息映射,该宏表示在为各个处理函,该宏表示在为各个处理函数所写的类声明之后存在消息映射条目,这些函数数所写的类声明
50、之后存在消息映射条目,这些函数是该类的成员函数。是该类的成员函数。u然后在类的然后在类的实现实现源文件中用源文件中用BEGIN_MESSAGE_MAP()BEGIN_MESSAGE_MAP()和和END_MESSAGE_MAP()END_MESSAGE_MAP()宏来宏来定义定义消息映射消息映射。Visual C+程序设计与应用教程2022/7/21任务单元二任务单元二 :MFCMFC编程基础编程基础 50 为了在一个处理消息的类中加入消息映射表,要在该类的类声明中(一般在头文件中)添加下面的宏调用。DECLEAR_MESSAGE_MAP()这条宏语句一般放在类定义的最后。例如,有一个 CMy