《【教学课件】第3章MFC应用程序设计基础.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第3章MFC应用程序设计基础.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 MFC应用程序设计基础 保定职业技术学院第3章 MFC应用程序设计基础 3.1 MFC应用程序向导3.2 MFC类的层次结构3.3 MFC应用程序框架3.4 MFC的消息映像3.5应用程序的调试3.6专题讨论与作业设计3.1 MFC应用程序向导创建基于对话框的应用程序 创建单文档应用程序 应用程序的简单分析 利用MFC应用程序向导建立的应用程序,用户没有编写一行代码,直接就可以编译运行。向导到底做了一些什么工作,生成了什么文件?3.1 MFC应用程序向导 mych3_1.ncbmych3_1.ncb/解决方案数据文件解决方案数据文件 mych3_1.sln mych3_1.sln/解决
2、方案文件解决方案文件 mych3_1.vcprojmych3_1.vcproj/VC+/VC+工程文件工程文件 ReadMe.txtReadMe.txt/ReadMe/ReadMe文件文件 mych3_1.hmych3_1.h/应用程序头文件,定义了应用程序头文件,定义了Cmych3_1AppCmych3_1App类类 mych3_1.cppmych3_1.cpp/应用程序源文件应用程序源文件 mych3_1Dlg.hmych3_1Dlg.h/应用程序对话框头文件应用程序对话框头文件 mych3_1Dlg.cppmych3_1Dlg.cpp/应用程序对话框源文件应用程序对话框源文件 stdaf
3、x.hstdafx.h/预编译头文件预编译头文件 stdafx.cppstdafx.cpp/预编译文件预编译文件 mych3_1.APSmych3_1.APS/项目的项目的APSAPS文件文件 mych3_1.rcmych3_1.rc/资源文件资源文件 DebugDebug/调试目录,调试目录,debugdebug版本的版本的exeexe文件等在此文件等在此目录生成目录生成 Resource.hResource.h/资源头文件资源头文件 resres/资源文件夹资源文件夹 resmych3_1.icoresmych3_1.ico/这是一个图标文件,用作应用程序的图标。这是一个图标文件,用作应用
4、程序的图标。3.2 MFC类的层次结构什么是MFC MFC是用来编写Windows应用程序的VC+类集,该类集以层次结构组织起来,其中封装了大部分Windows API函数,它所包含的功能涉及到整个Windows操作系统。MFC不仅为用户提供了Windows图形环境下的应用程序框架,而且还提供了创建应用程序的组件。3.2 MFC类的层次结构3.2 MFC类的层次结构 应用程序主要的类应用程序主要的类 1.1.根类根类 CObjectCObject类是类是MFCMFC的抽象基类,是的抽象基类,是MFCMFC中多数类的根类,它中多数类的根类,它为程序员提供了许多编程所需的公共操作如对象的建立和删为
5、程序员提供了许多编程所需的公共操作如对象的建立和删除、串行化支持、对象诊断输出、运行时信息及集合类的兼除、串行化支持、对象诊断输出、运行时信息及集合类的兼容等。从根类派生的类有三大特性,即动态性、诊断性和持容等。从根类派生的类有三大特性,即动态性、诊断性和持续性。续性。动态性是指程序在运行时,可以获得对象的大小和类名,还动态性是指程序在运行时,可以获得对象的大小和类名,还可以动态创建类的实例,也就是通过可以动态创建类的实例,也就是通过CObjectCObject类提供的类提供的IsKindOfIsKindOf()()和和GetRuntimeClassGetRuntimeClass()两个成员函
6、数检索对象的类名及()两个成员函数检索对象的类名及其它信息。其它信息。IsKindOf()IsKindOf()测试对象与相关类之间的关系,测试对象与相关类之间的关系,GetRuntimeClassGetRuntimeClass()()用于返回用于返回CRuntimeClassCRuntimeClass类对象的结构,包含类运行时的类对象的结构,包含类运行时的类名、基类名等信息。类名、基类名等信息。3.2 MFC类的层次结构应用程序主要的类应用程序主要的类 1.1.根类根类诊断性是指提供了把对象状态转储给调试机制(通诊断性是指提供了把对象状态转储给调试机制(通常是输出窗口)的能力,它通过成员函数常
7、是输出窗口)的能力,它通过成员函数AssertValidAssertValid()()和和Dump()Dump()以及以及CDumpContextCDumpContext类,解决了向调试类,解决了向调试窗口输出对象信息的问题。窗口输出对象信息的问题。持续性是对象本身能够将对象数据保存到存储介质持续性是对象本身能够将对象数据保存到存储介质中,或反过来从存储介质上读取数据并建立对象。中,或反过来从存储介质上读取数据并建立对象。它主要是通过它主要是通过SerializeSerialize和和IsSerializableIsSerializable两个成员函两个成员函数实现的。数实现的。3.2 MFC
8、类的层次结构2.应用程序体系结构类应用程序体系结构类用于构建应用程序的框架,提供大多数应用程序公用的功能。通过使用MFC应用程序向导,就可以建立应用程序的框架结构,用户编写程序的任务只是在应用程序框架内添加处理代码。应用程序体系结构主要有命令目标类、窗口应用程序类、文档/视图类和线程基类等。3.2 MFC类的层次结构3.3.可视对象类可视对象类(1 1)窗口类()窗口类(CWndCWnd)(2 2)视图类()视图类(CViewCView)(3 3)菜单类()菜单类(CMenuCMenu)(4 4)对话框类()对话框类(CDialogCDialog)(5 5)控件类)控件类(6 6)控件条类()
9、控件条类(CControlBarCControlBar)(7 7)设备描述表类()设备描述表类(CDCCDC)(8 8)图形设备接口对象类()图形设备接口对象类(CGdiObjectCGdiObject)3.2 MFC类的层次结构4.通用类CFile类:提供访问二进制磁盘文件的接口类。CArchive类:与CFile类对象一起通过串行化实现对象的永久存储。CException类:该类是所有异常的基类,可以用派生类来捕获指定的异常。CArray类:将元素存储在数组中。CList类:将元素存储在链表中。3.2 MFC类的层次结构5.支持数据库开发的类ODBC数据库支持类提供了一些类来支持数据库开发
10、,主要有CDataBase类、CRecordset类、CRecordView类等。DAO数据库支持类主要有CDaoDataBase类、CDaoQueryDef类、CDaoRecordset类、CDaoTableDef类、CDaoWorkspace类等。3.2 MFC类的层次结构6.简单数据类型的封装类这些类是没有继承关系的,它们用来封装Widnows常用的一些简单数据结构。CRect矩形类:封装Windows的RECT结构。CSize尺寸类:封装Windows的SIZE结构。CTime时间类:用来处理绝对时间。CString字符串类:提供对字符串的操作。3.3 MFC应用程序框架MFC应用程序
11、框架的基本类 3.3 MFC应用程序框架MFC应用程序启动过程(1)创建应用程序对象(2)Windows调用WinMain函数(3)WinMain函数调用InitInstance成员函数(4)WinMain函数调用Run函数3.3 MFC应用程序框架应用程序的启动过程应用程序的启动过程 3.4 MFC的消息映像1.1.什么是消息映像什么是消息映像 MFC MFC是通过在每一个能够接收和处理消息的类是通过在每一个能够接收和处理消息的类中,定义一个消息和消息处理函数的静态对照表,中,定义一个消息和消息处理函数的静态对照表,该表就叫做消息映像表,这种消息与消息处理函数该表就叫做消息映像表,这种消息与
12、消息处理函数一一对应的关系叫做消息映像。在消息映像表中,一一对应的关系叫做消息映像。在消息映像表中,保存了该类能够处理的所有消息及其对应的消息处保存了该类能够处理的所有消息及其对应的消息处理函数的地址。当需要消息处理时,应用程序的理函数的地址。当需要消息处理时,应用程序的RunRun函数就会将消息分发给相应的目标窗口函数,函数就会将消息分发给相应的目标窗口函数,目标窗口函数就会通过消息映像查找这个消息的处目标窗口函数就会通过消息映像查找这个消息的处理函数,找到后就调用,否则到基类的消息映像中理函数,找到后就调用,否则到基类的消息映像中寻找,最后如果找不到消息处理函数,则调用寻找,最后如果找不到
13、消息处理函数,则调用WindowsWindows的默认消息处理函数的默认消息处理函数 。3.4 MFC的消息映像3.4 MFC的消息映像2.2.消息处理路径消息处理路径 MFC MFC应用程序对于不同的消息其处理的路径也不同,当被应用程序对于不同的消息其处理的路径也不同,当被判定为窗口消息后,将直接对消息所属的窗口类的消息映像判定为窗口消息后,将直接对消息所属的窗口类的消息映像表进行搜索,找到匹配的消息处理函数后便执行它;如果找表进行搜索,找到匹配的消息处理函数后便执行它;如果找不到将搜索目标窗口类的基类。如果都没有找到,将调用缺不到将搜索目标窗口类的基类。如果都没有找到,将调用缺省的消息处理
14、函数。当判定为命令消息后,将依次搜索视图省的消息处理函数。当判定为命令消息后,将依次搜索视图类及其基类的消息映像表、文档类及其基类映射表、文档模类及其基类的消息映像表、文档类及其基类映射表、文档模板类及其基类映射表、框架窗口类(多文档时为板类及其基类映射表、框架窗口类(多文档时为MDIFrameWndMDIFrameWnd、MDIChildWndMDIChildWnd)、应用程序类及其基类映)、应用程序类及其基类映射表。在命令消息搜索的过程中,只要找到命令消息的一个射表。在命令消息搜索的过程中,只要找到命令消息的一个处理函数,将终止向后搜索;如果没有找到,命令对应的菜处理函数,将终止向后搜索;
15、如果没有找到,命令对应的菜单或工具栏按钮将变灰显示。当判定为控件消息后,将首先单或工具栏按钮将变灰显示。当判定为控件消息后,将首先搜索控件窗口类所属的类处理,如果没有找到,则搜索父窗搜索控件窗口类所属的类处理,如果没有找到,则搜索父窗口类的消息映像表。口类的消息映像表。3.4 MFC的消息映像 3.3.能够处理消息的类能够处理消息的类哪些类能够处理消息(也就是具有消息映像)?通过上面的介哪些类能够处理消息(也就是具有消息映像)?通过上面的介绍,我们已经有了一定的了解,下面总结如下:绍,我们已经有了一定的了解,下面总结如下:CWndCWnd类及其派生类都可以接收和处理消息,在开发工具的属类及其派
16、生类都可以接收和处理消息,在开发工具的属性窗口中,通过消息或事件列表来添加窗口消息或命令事件性窗口中,通过消息或事件列表来添加窗口消息或命令事件的处理函数。的处理函数。派生于派生于CcmdTargetCcmdTarget类的非窗口类,只能处理类的非窗口类,只能处理WM_COMMANDWM_COMMAND命令消息,在开发工具中,通过事件列表来添加命令事件的命令消息,在开发工具中,通过事件列表来添加命令事件的处理函数。处理函数。在能够处理消息的类的头文件中必须有在能够处理消息的类的头文件中必须有DECLARE_MESSAGE_MAPDECLARE_MESSAGE_MAP宏,在类的实现文件宏,在类的
17、实现文件CPPCPP文件文件中使用中使用BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP和和END_MESSAGE_MAPEND_MESSAGE_MAP宏。宏。3.5应用程序的调试一个应用程序的代码编写完之后,要想运行应用程一个应用程序的代码编写完之后,要想运行应用程序必须编译和连接。序必须编译和连接。VC+VC+编译器在编译和连接时,编译器在编译和连接时,会检查语法错误,提供编译连接时的错误信息,帮会检查语法错误,提供编译连接时的错误信息,帮助用户修改错误。一个大的应用程序,一般要分阶助用户修改错误。一个大的应用程序,一般要分阶段编译也就是写完一个基本的类或函数就要编译改
18、段编译也就是写完一个基本的类或函数就要编译改错,这样可以降低程序的调试难度。一个程序编译错,这样可以降低程序的调试难度。一个程序编译连接通过之后,并不能保证程序的正常工作,经常连接通过之后,并不能保证程序的正常工作,经常会发生一些运行错误,开发人员可以通过会发生一些运行错误,开发人员可以通过DebugDebug调调试或试或TRACETRACE宏,找到错误点进而解决程序运行错误。宏,找到错误点进而解决程序运行错误。3.6专题讨论与作业设计 专题讨论专题讨论(1 1)MFCMFC应用程序向导的使用方法应用程序向导的使用方法(2 2)构成)构成WindowsWindows应用程序的应用程序的MFCM
19、FC应用程序框架类之间的关系应用程序框架类之间的关系(3 3)MFCMFC应用程序的启动过程应用程序的启动过程(4 4)MFCMFC应用程序的消息处理机制应用程序的消息处理机制(5 5)鼠标与键盘消息的处理)鼠标与键盘消息的处理 作业设计作业设计设计一个单文档结构的应用程序,在应用程序窗口的工作区中响应键盘输设计一个单文档结构的应用程序,在应用程序窗口的工作区中响应键盘输入,要求如下:入,要求如下:(1 1)单击键盘上的方向键时,窗口中显示)单击键盘上的方向键时,窗口中显示“你按了方向键你按了方向键”;(2 2)单击)单击键时,窗口中显示键时,窗口中显示“你按下了你按下了ShiftShift键键”;(3 3)单击)单击键时,窗口中显示键时,窗口中显示“你按下了你按下了CtrlCtrl键键”;(4 4)单击)单击键时,窗口显示键时,窗口显示“你按下了你按下了Ctrl+ACtrl+A键键”;(5 5)单击)单击键时,窗口显示键时,窗口显示“你按下了你按下了Alt+BAlt+B键键”。