1、Visual C+程序设计教程 2022-7-19Visual C+程序设计教程第1章2第1章 Visual C+6.0集成开发环境 1.1 Visual C+6.0 工程及其文件构成 Windows应用程序,一般都是由多个文件组成,包括源程序文件、头文件、资源文件等等,所以有必要引入工程的概念。将一个应用程序作为一个工程,用工程化管理,使组成应用程序的所有文件形成一个有机的整体。工程包含了用户打开、编译、连接和调试应用程序时所需的所有文件。2022-7-19Visual C+程序设计教程第1章31.1.1 Visual C+中的文件 扩展名为.dsw的文件:也被称为Workspace文件,在
2、创建一个工程工作空间时,系统会产生一个工程文件。此文件用来存储位于工程空间一级的信息,包括:源文件清单、编译选择、连接选择、路径选择、系统需求等设置。扩展名为.dsp 的文件:在VC中,应用程序是以Project的形式存在的,Project文件以.dsp扩展名,在Workspace文件中可以包含多个Project,由Workspace文件对它们进行统一的协调和管理。2022-7-19Visual C+程序设计教程第1章4Visual C+中的文件 扩展名为.opt的文件 这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息 扩展名为.clw的文件是用来存放应用程序中用到
3、的类和资源的信息的,这些信息是VC中的ClassWizard工具管理和使用类的信息来源。此外,对应每个应用程序有一个readme.txt文件,这个文件中列出了应用程序中用到的所有的文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。2022-7-19Visual C+程序设计教程第1章5Visual C+中的文件 在应用程序中大量应用的是以.h和.cpp为扩展名的文件,其中以.h为扩展名的文件称为头文件,以.cpp为扩展名的文件称为实现文件。在应用程序中经常要使用一些位图、菜单之类的资源,VC中以.rc为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的Wind
4、ows资源。2022-7-19Visual C+程序设计教程第1章6Visual C+中的文件 以.rc2为扩展名的文件也是资源文件,但这个文件中的资源不能在VC的集成环境下直接进行编辑和修改,而是根据需要手工地编辑这个文件。对于以.ico,.bmp等为扩展名的文件是具体的资源。2022-7-19Visual C+程序设计教程第1章71.1.2 工作空间中的文件 在创建好一个工作空间后,单击File View标签,可以查看到用户已创建的工程。扩展其中的文件夹可以显示工程中的所有文件:l Source Files 源文件l Header Files 头文件l Resource Files 资源文
5、件l ReadMe.txt文本文件 2022-7-19Visual C+程序设计教程第1章81.1.3 可以创建的文件类型和工程类型 l Active Sever Page:活动服务器页文件l Binary File:二进制文件l Bitmap File:位图文件l C/C+Header File:C或C+头文件l C+Source File:C+源文件l Cursor File:光标文件l HTML Page:HTML超文本文件l Icon File:图标文件l Macro File:宏文件l SQL Script File:SQL脚本文件l Resource Script:资源脚本文件l
6、Resource Template:资源模板文件l Text File:文本文件2022-7-19Visual C+程序设计教程第1章91.2 启动Visual C+6.0 1.2.1 Visual C+6.0的启动界面 2022-7-19Visual C+程序设计教程第1章10Visual C+6.0的启动界面 菜单和工具栏:位于界面的上面一部分。工作区窗口:界面中间左边的那个窗口。客户区窗口,也称为编辑窗口:界面中间右边的那个窗口,与工作区窗口平行。输出窗口:位于状态栏上方。状态栏:界面的最下方部分。2022-7-19Visual C+程序设计教程第1章111.2.2 Visual C+6
7、.0的功能菜单 文件菜单(File 菜单)编辑菜单(Edit 菜单)查看菜单(View 菜单)插入菜单(Insert 菜单)项目管理菜单(Project 菜单)编译执行菜单(Build 菜单)工具菜单(Tool 菜单)窗口菜单(Window 菜单)帮助菜单(Help 菜单)2022-7-19Visual C+程序设计教程第1章121.3 Visual C+6.0集成开发环境概述 集成开发环境IDE(Integrated Develop Environment),是一个集成程序编译器、调试工具和建立应用程序工具的主体。Visual C+6.0软件包的中心部分是Developer Studio,这
8、个集成开发环境集成了开发工具和Visual C+编译器。Visual C+和Developer Studio构成了一个完整的集成开发环境,它使创建一个Windows程序变得很简单。2022-7-19Visual C+程序设计教程第1章131.3.1 项目工作区 项目工作区包含三个标签:ClassView标签、Resource View标签和File View标签。l ClassView标签显示当前工作区中工程的所有类、结构和全局变量。l Resource View标签显示当前工作区中工程的所有资源,包括:加速键表、位图、对话框、图标、菜单、工具栏、字符串表和版本信息。l File View标签
9、显示当前工作区中工程的所有文件,包括:C+源文件、头文件、资源文件和外部文件。2022-7-19Visual C+程序设计教程第1章141.3.2 应用程序向导AppWizard AppWizard创建一个框架窗口应用程序所需要的所有源文件。它用MFC类库包含以下几个函数:l 自动支持普通的Windows对话框,包括Print、File Open和File Save As。l 可定位的工具栏。l 可选择的Internet Explorer 风格的工具栏,也即ReBars。l 一个状态栏。l 可选择的MAPI、ODBC和OLE支持。2022-7-19Visual C+程序设计教程第1章15应用程
10、序向导AppWizard通常,以下的步骤用于使用AppWizard建立一个程序:1)使用AppWizard创建一个程序框架。2)为程序创建任意其它需要的资源。3)用ClassWizard增加所需的类和信息处理函数。4)添加程序所需要的函数。用户必须为这部分写一些代码。2022-7-19Visual C+程序设计教程第1章161.3.3 向导ClassWizard 类向导ClassWizard对话框分成五个标签:Message Maps(用于消息映射)Member Variables(用于处理成员变量)Automation(用于给类增加属性和方法)ActiveX Events(用于处理控件的事件
11、)Class Info(用于查看本工作区中的所有类的基类名、头文件名、CPP文件名等)2022-7-19Visual C+程序设计教程第1章17Windows消息 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE 键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP 鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBCLICK,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_RBUTTONDBCLICK。2022-7-19Visual C+程序设计教程第1章18Windows消息另一
12、组窗口消息:WM_MOVE,WM_SIZE,WM_PAINT 焦点消息:WM_SETFOCUS,WM_KILLFOCUS 定时器消息:WM_TIMER 2022-7-19Visual C+程序设计教程第1章19向导ClassWizard使用ClassWizard的这五个标签,用户可以进行以下操作:l 创建新类,这些新类是从处理Windows消息和记录集的主框架类继承得到的;l 将消息映射到函数;l 创建新的消息处理函数;l 定义成员变量;l 删除消息处理函数;l 查看哪些消息已经有了处理函数,然后跳到该处理函数的代码处;l 创建新类时,添加自动化方法和属性;l 与类和类库协同工作;2022-7
13、-19Visual C+程序设计教程第1章201.3.4 向导工具栏WizardBar 向导工具栏WizardBar通过对话框资源等可视途径,为用户提供了对工程中类及类成员的访问。对于实现对话框资源的类,WizardBar能使用户很容易地在对话框资源编辑器和代码间切换。2022-7-19Visual C+程序设计教程第1章21向导工具栏WizardBarWizardBar的界面包含三个组合框:类列表(WizardBar C+Class)过滤器列表(WizardBar C+Filter)成员列表(WizardBar C+Members)此外,还包含一个图控件:WizardBar Action 2
14、022-7-19Visual C+程序设计教程第1章22WizardBar的上下文跟踪 WizardBar能动态跟踪源代码的当前位置,显示当前工程中的相关信息。以下的情况下,WizardBar不能进行跟踪:l 当前文件不属于活动的工程;l 当前的文件不是工程的一部分;l 当前的文件不是用编程语言写的,比如说文本文件就是不可编译的;l 同时运行了多个IDE,并且同时查看同一个工程;l 当前的窗口不支持跟踪功能。除了文本编辑器和对话框编辑器外,其他窗口就不支持跟踪功能。2022-7-19Visual C+程序设计教程第1章231.4 小结小结本章主要介绍了Visual C+6.0的启动界面以及Vi
15、sual C+6.0的集成开发环境。介绍了应用程序向导AppWizard、类向导ClassWizard和向导工具栏WizardBar。第2章 程序开发基础 2022-7-19Visual C+程序设计教程第2章252.1 C+语法基础 在这一节中,将介绍C+的特点和基本功能。主要包括:C+中的语法、类、对象、类的继承和多态性以及C+中的输入输出流。2022-7-19Visual C+程序设计教程第2章262.1.1 C+程序的构成 一个标准的C+程序由三个部分构成:预处理命令预处理命令位于行首,以符号开始,C+提供的预处理命令有宏定义命令、文件包含命令和条件编译命令三种。函数函数是根据进去的信
16、息(输入)和产生的东西(输出结果)所定义的一个黑盒。C+程序由若干个函数构成,有且只有一个主函数main()。函数分为库函数和自定义函数两大类。2022-7-19Visual C+程序设计教程第2章27C+程序的构成(续)程序语句 程序语句是程序的基本组成部分,一个语句是给计算机的一条完整的指令。在 C+里,一个语句是在结尾处用分号结束的。C+提供了说明语句、赋值语句、程序控制语句、复合语句及空语句等。2022-7-19Visual C+程序设计教程第2章282.1.2 C+的语言基础 C+的词法规则:关键字 标识符 语言符号 注释符 C+的数据类型:基本类型:包括整型(int)、浮点型(fl
17、oat)、字符型(char)和逻辑型(bool)2022-7-19Visual C+程序设计教程第2章29C+的数据类型(续)空类型 :void类型 构造类型:常见的构造类型有数组、结构体、联合体和枚举。指针类型:指针类型变量用于存储另一变量的地址,而不能用来存放基本类型的数据。它在内存中占据一个存储单元。类类型:类是体现面向对象程序设计的最基本特征,也是体现C+与C最大的不同之处。类也是一个数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质。2022-7-19Visual C+程序设计教程第2章302.1.3 C+中的类与对象 对象是构成世界的一个独立单位,
18、它具有自己的静态特征和动态特征。静态特征是可以用某种数据来描述的特征。动态特征即对象所表现的行为或对象所具有的功能。类是面向对象语言必须提供的用户定义的数据类型,它将具有相同状态、操作和访问机制,多个对象抽象成为一个对象类。2022-7-19Visual C+程序设计教程第2章31 C+中的类与对象(续)类的一般定义格式如下:classprivate:;protected:;public:;2022-7-19Visual C+程序设计教程第2章32 C+中的类与对象(续2)定义类的函数成员的格式如下:返回类型 类名:成员函数名(参数列表)函数体对象的定义格式如下:;2022-7-19Visua
19、l C+程序设计教程第2章33C+中的类与对象(续3)对象的成员(一个对象的成员是该对象的类所定义的成员)表示如下:.或者:2022-7-19Visual C+程序设计教程第2章342.1.4 类的继承和多态性 继承是面向对象设计的基本特征之一,是从已有的类基础上建立新类。通过C+语言中的继承机制,一个新类既可以共享另一个类的操作和数据,也可以在新类中定义已有类中没有的成员。C+的另一个重要的特征是支持多态。所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。2022-7-19Visual C+程序设计教程第2章35继承如在定义类B时,如果继承类A,就会自动得到类A的操作和数据属性,使
20、得程序员需定义类A中所没有的新成分即可完成在类B的定义,这样称类B继承了类A,类A派生了类B。这种机制称为继承继承。称类A为基类或父类,类B为派生类或子类。继承的定义格式如下:class :2022-7-19Visual C+程序设计教程第2章36继承(续)有三种关键字给予表示:l public:公有继承,其特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。l protected:保护继承,其特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。l private:私有继
21、承,其特点是基类的公有成员和保护成员作为派生类的私有成员,并且不能被这个派生类的子类访问。2022-7-19Visual C+程序设计教程第2章37继承实例/基类class CBasepublic:void FuncA(void);void FuncB(void);/派生类class CDerive:public CBasepublic:void FuncC(void);void FuncD(void);/实例主程序main()CDerive b;/CDerive的一个对象 bFuncA();/CDerive从CBase继承了函数FuncA bFuncB();/CDerive从CBase继承了
22、函数FuncB bFuncC();bFuncD();2022-7-19Visual C+程序设计教程第2章38多态C+的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现。在程序编译时多态性体现在函数和运算符的重载上。2022-7-19Visual C+程序设计教程第2章39多态实例class CBasepublic:virtual void FuncA(void)coutFuncA();class CDeriveA:public CBasepublic:virtual void FuncA(void)cout”This is CDeriveA:FuncAn”;cl
23、ass CDeriveB:public CBasepublic:virtual void FuncA(void)cout”This is CDeriveB:FuncAn”;2022-7-19Visual C+程序设计教程第2章40多态实例(续)/主程序main()CBase b;/CBase的一个对象 CDeriveA objectA;/CDeriveA的一个对象 CDeriveB objectB;/CDeriveB的一个对象 Test(&b);Test(&objectA);Test(&objectB);/输出结果This is CBase:FuncAThis is CDeriveA:Func
24、AThis is CDeriveB:FuncA2022-7-19Visual C+程序设计教程第2章412.1.5 C+中的输入输出流 例:coutname;cout”Your name is:”namen;第一条语句用到了标准输出流cout和运算符,称为流提取运算符。与C中的printf和scanf不同的是,流插入运算符和流提取运算符不需要指示输出输入数据类型的格式,控制串、转换说明符和运算符能自动识别要用的类型。2022-7-19Visual C+程序设计教程第2章42C+中的输入输出流(续)用C+风格的面向流的输入输出可以使得程序具有更好的可读性,并且能减少出错的可能。v注意:C+程序必
25、须包含头文件iostream.h后才能使用输入输出流,这一文件包含了所有输入输出流操作所需的基本信息。2022-7-19Visual C+程序设计教程第2章432.2 AppWizard的使用 AppWizard是一个基于用户的选择创建MFC项目的一个工具。AppWizard创建作为一个框架项目所需要的所有源文件,这个框架项目是应用程序的起始点。可以用AppWizard创建单文档、多文档或者基于对话框的应用程序。2022-7-19Visual C+程序设计教程第2章44AppWizard第一步 AppWizard第一步:指定应用程序风格AppWizard对于需要创建应用程序的类型提供了三种选项
26、:Single Document Interface(SDI,单文档界面)Multiple Document Interface(MDI,多文档界面)Dialog based(基于对话框)2022-7-19Visual C+程序设计教程第2章45AppWizard第一步(续)在AppWizard第一步的对话框中还可指定一个特殊的选项:DocumentView Architecture Support复选框 大多数情况下,可以让它保持为缺省(选中)状态。如果选中,表示应用程序采用文档视图结构。这种结构将文档数据的存取和显示分离了出来。采用文档视图结构可以更清晰、方便地实现多种功能。2022-7-
27、19Visual C+程序设计教程第2章46AppWizard第二步 AppWizard第二步:指定数据库支持选项 如果没有写数据库的应用程序,选择None;如果不想从CFormView 派生视类,也不想有Record菜单,选择Header files only,即只用到ODBC必需的一些头文件;如果想从CFormView 派生视类,并且有Record菜单,但不必序列化(Serialize)一个文档,选择Database view without file support,这样程序就可以通过CRecordset来修改数据库的元组(记录);如果想要求数据库的支持,同时要序列化文档,选择Datab
28、ase view with file support。2022-7-19Visual C+程序设计教程第2章47AppWizard第三步 AppWizard第三步:设置COM选项 如果不想编写ActiveX(或先前的OLE,ActiveX和OLE技术被统称为复合文档技术)应用程序,选择None;如果要求应用程序能嵌入或连接的ActiveX对象,如Word文档或Excel中的工作表,选择Container;如果希望应用程序能为其它应用程序提供文档服务,且应用程序不必作为一单独的应用程序,选择Mini-server;2022-7-19Visual C+程序设计教程第2章48AppWizard第三步
29、(续)如果希望应用程序作为一个可以独立的运行程序,选择Full-server;如果希望应用程序既能包含其它应用程序中的对象,又能为其它应用程序提供对象,则选择Both container and server2022-7-19Visual C+程序设计教程第2章49AppWizard第四步 AppWizard第四步:决定窗口的样式 Docking Toolbar(预设工具条)Initial status bar(初始状态栏)Printing and print preview(打印和打印预览)3D Controls(三维控件)Context-sensitive Help(上下文相关帮助)MAP
30、I(消息API)Windows Sockets(Windows套接字)2022-7-19Visual C+程序设计教程第2章50 AppWizard第五步:窗口风格、注释和类型 如果希望工程具有MFC标准风格,则应用选择MFC Standard;如果希望工程具有浏览风格,即拥有切分窗口,左边窗口显示树形视图,右边窗口显示列表视图,则选择Windows Explorer;如果希望在源代码中产生注释,则选择Yes,please,反之,选择No,thank you。AppWizard第五步 2022-7-19Visual C+程序设计教程第2章51AppWizard第六步 AppWizard第六步:
31、改变视图的基类 可以修改缺省类名、基类、头文件或实现文件名。选择不同的应用程序视图基类,应用程序工作的方式也会相应地改变。单击Finish按钮,就完成了AppWizard提供的所有选项。2022-7-19Visual C+程序设计教程第2章522.3 一个简单的应用程序 创建过程:在Visual C+6.0的启动界面中,选择“FileNew”,在弹出的“New”对话框中单击“Projects”选项卡。选择“MFC AppWizard(exe)”,在“Location”编辑框中输入要建立的工程所在的目录。在右上方的“Project name”编辑框中输入工程名称Eg2_1,单击OK按钮,弹出MF
32、C AppWizard 向导对话框。在第一步中选择Single document,建立一个单文档界面应用程序SDI。取其默认值,直到第六步结束。2022-7-19Visual C+程序设计教程第2章532.3.2编译、链接并运行程序 选择BuildBuild Eg2_1.exe菜单项或者按F7键进行编译、链接。选择BuildExecute Eg2_1.exe菜单项或者按Ctrl+F5键,可以看到运行结果。2022-7-19Visual C+程序设计教程第2章542.4 程序结构剖析 MFC AppWizard一共生成了五个类:CAboutDlgCEg2_1AppCEg2_1DocCEg2_1V
33、iewCMainFrame 2022-7-19Visual C+程序设计教程第2章55分析五个类1.CAboutDlg类的基类是CDialog。可以通过双击ClassView中CAboutDlg来查看,这时右边的文本编辑器中出现CDboutDlg的类定义。它在程序中的表现就是选择主菜单中“帮助”下的“关于Eg2_1.”后出现的对话框。2.CEg2_1App类代表整个应用程序,它由CWinApp派生。2022-7-19Visual C+程序设计教程第2章56分析五个类(续)在MFC中,一个应用程序的真正的入口点是AfxWinMain(),但它并不在工程中的任何一个文件中存在,仅在程序编译链接时加
34、入工程中,在AfxWinMain()中调用了MFC应用程序的InitInstance()函数进行初始化,然后进入MFC的消息循环,这样程序就开始运行起来。所以可以认为InitInstance()是程序员能够修改的最先被执行的函数。2022-7-19Visual C+程序设计教程第2章57分析五个类(续)3.CEg2_1Doc和CEg2_1View类两个类组成了MFC著名的Doc/View体系结构。文档负责存储处理各种数据,并负责文档内容的系列化,视图负责显示文档内容。SDI应用程序的Doc/View模型比较简单,应用程序可以拥有多个文档模板,但每次只能有一个活动模板,只有一个视图。2022-7
35、-19Visual C+程序设计教程第2章58分析五个类(续)4.CMainFrame类即主框架类。CMainFrame是从CFrameWnd中派生出来的。AppWizard在CMainFrame类中主要生成了两个函数,即:重载了基类的PreCreateWindow()函数建立了响应WM_CREATE的消息处理函数OnCreate()。此外,CMainFrame类中还内嵌了工具栏类的对象m_wndToolBar和状态栏类的对象m_wndStatusBar。2022-7-19Visual C+程序设计教程第2章592.5 Win32编程基础编程基础Win32的数据类型:Windows.h是用户调
36、用系统功能的关键,文件中定义了Windows系统使用的数据类型,其中包括许多简单类型和结构。句柄:句柄(handle)是整个Windows编程的基础。一个句柄是指系统创建对象后返回的用来代表该对象的一个值,它是Windows使用的一个唯一的整数值,是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。2022-7-19Visual C+程序设计教程第2章60Win32编程基础(续)编程基础(续)标识符命名 标识符可以作为变量、类、函数、用户定义类型的名字。标识符可以是任意长度,但是默认情况下VC+6.0只以前面250个字符区分。与C+的标识符命名一样,VC+6.0中的标识符
37、也遵循如下几条规则:l 以大写字母、小写字母或下划线“_”开始。l 可以由大写字母、小写字母、下划线“_”或数字09组成。l大写字母和小写字母代表不同的标识符,如“Message”和“message”就是两个不同的标识符。l不能是关键字。注意:在Visual C+中,使用匈牙利标记法(Hungarian Notation)来为变量命名,如在成员变量前使用“m_”,这可以指明变量的类型。2022-7-19Visual C+程序设计教程第2章612.6 小结小结详细介绍了使用AppWizard来创建应用程序,分析了在新创建的单文档应用程序Eg_1中所包含的五个类以及它们的实现方法。对C+的语法作了
38、简要的介绍,并对Win32编程中的数据类型、句柄以及标识符命名等基本概念进行了说明。第3章 构造应用程序框架 2022-7-19Visual C+程序设计教程第3章633.1 单文档应用框架 所谓的单文档(SDI)界面应用程序,是指在应用程序中一次只能打开一个文件处理。打开下一个文件之前,必须先关闭上一个打开的文件,才能执行下一个打开操作。对于涉及文档较少的程序,只容许处理单个文档的程序或执行其它功能。2022-7-19Visual C+程序设计教程第3章64创建过程 1.创建工程。按照前一章创建工程的步骤创建一个工程,类型为SDI,工程名为Eg3_1,其他选项取默认值。2.单击“OK”按钮,
39、AppWizard就开始创建应用的子目录、文件和类。3.添加自己的代码:2022-7-19Visual C+程序设计教程第3章65创建过程(续)扩充Eg3_1View.cpp中的OnDraw成员函数:void CEg3_1View:OnDraw(CDC*pDC)CEg3_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-TextOut(60,100,Hello,Welcome to Visual C+6.0!);2022-7-19Visual C+程序设计教程第3章66创
40、建过程(续)4.更改应用程序的标题:选择工作区中ResourceVies标签,展开Eg3_1 ResourcesString Table,双击String Table,弹出字符串资源表。双击IDR_MAINFRAME项,弹出String Properties对话框。在Caption编辑框中将标题修改为“单文档应用程序nEg3_1”。5.编译、链接并运行。2022-7-19Visual C+程序设计教程第3章67CEg3_1App应用程序运行过程 CWinApp类创建的实例theApp,整个程序有且只有一个,一切由它开始,最后以它结束。Visual C+所产生的代码首先通过初始化数据段来建立全局
41、变量,以及建立一些MFC内部使用的对象,然后执行CWinApp类的构造函数。2022-7-19Visual C+程序设计教程第3章68CEg3_1App应用程序运行过程(续)一旦所有静态对象的构造函数都执行完毕,运行时间库就会调用WinMain()函数,该函数初始化MFC应用,并调用CWinApp类的InitInstance()函数。完成了这些工作后,WinMain()函数调用CWinApp类的Run()函数,通常默认为CWinThread:Run(),用来得到应用程序的消息循环,或称消息队列。2022-7-19Visual C+程序设计教程第3章69CEg3_1App应用程序运行过程(续)当
42、程序接收到WM_QUIT消息,就意味着程序终止。这时,MFC会调用CWinApp类的ExitInstance(),然后是静态对象的析构函数,包括CWinApp对象,然后将控制权交还操作系统。2022-7-19Visual C+程序设计教程第3章70 3.2 多文档应用框架 多文档(MDI)接口应用程序是指一个应用程序可以同时打开多个文件进行处理。MDI是大多数应用程序采用的形式。Microsoft公司的Word应用软件就是一个典型的多文档应用。2022-7-19Visual C+程序设计教程第3章71单文档应用程序和多文档应用程序的比较 在MDI程序中许多程序的细节是与SDI程序是相同的。在M
43、DI程序中使用了CMultiDocTemplate模板,以便程序能够处理多个文档,同时也将视图和文档类连接到该模板及CChildFrame类,CChildFrame类支持出现在主窗口内部的MDI子窗口。2022-7-19Visual C+程序设计教程第3章72 3.3 基于对话框的应用框架 基于对话框的应用程序,是以对话框为形式的应用程序,它对于那些涉及文档较少,主要是交互式操作的应用程序来说比较合适。基于对话框的应用框架和前面介绍的基于文档的应用框架有很大的区别。2022-7-19Visual C+程序设计教程第3章73创建过程 在AppWizard的第一步,即MFC AppWizard-S
44、tep 1中,选中“Dialog based”单选框按钮。在第四步,AppWizard会显示出它将帮助用户创建的类及属性。在这个基于对话框的应用中只有两个类被创建。一个是应用类CEg3_3App,另一个是对话框类CEg3_3Dlg。2022-7-19Visual C+程序设计教程第3章74创建过程(续)修改对话框资源:在Text properties对话框中,将Caption框中的“TODO:在这里设置对话控制。”删除,改成为“Hello,Welcome to Visual C+!”。编译、链接、运行。注意:基于对话框的应用框架和基于文档的应用框架的区别在于实现对话框的第一步是创建一个对话框对
45、象dlg,然后通过调用对话类的成员函数DoModal()来显示对话框。2022-7-19Visual C+程序设计教程第3章753.4 程序运行流程分析 Windows的编程模式:Windows程序运行总是由WinMain()函数开始,该函数主要是建立应用程序的主窗口。Windows程序通过操作系统发送的消息来处理用户输入,程序的主窗口中需要包含处理Windows所发送消息的代码。2022-7-19Visual C+程序设计教程第3章76MFC应用程序的运行过程 2022-7-19Visual C+程序设计教程第3章77MFC应用程序的运行过程(续)MFC的应用程序运行过程如下:1.应用程序定
46、义一个应用类全局对象。2.应用类对象的构造函数开始执行。3.构造函数执行完后,调用初始化函数InitInstance()。4.在函数InitInstance()中,构造文档模板。5.构造文档模板时,按照生成一个文档的顺序先产生一个最初的文档、视主框架。6.函数InitInstance()生成工具条和状态条,以及其它用户需要的工具。7.函数InitInstance()执行完成后,应用程序处于等待消息的状态。2022-7-19Visual C+程序设计教程第3章78三种应用程序框架的异同 相同:每个应用程序的应用类都会自动创建一个InitInstance()函数 相异:单文档应用程序中,应用类的对
47、象由应用框架构造,使用单文档模板类CSingleDocTemplate的对象来构造文档模板。2022-7-19Visual C+程序设计教程第3章79三种应用程序框架的异同(续)MDI应用程序中,应用类的对象同样也由应用框架构造,使用多文档模板类CMulitDocTemplate对象来构造文档模板。基于对话框的应用程序中,首先在函数中生成一个对话框对象,然后再通过DoModal()函数来调用和显示这个对话框。2022-7-19Visual C+程序设计教程第3章803.5 小结 本章介绍了MFC的三种基本应用框架,并通过三个简单的“Hello,Welcome to C+6.0!”实例来说明这三
48、个应用框架的区别。第4章 Microsoft类库基础4.1 Microsoft类库概述MFC(Microsoft Foundation Class)类库是Visual C+程序设计的核心,它封装了许多常用的Windows API函数,绝大部分的Visual C+应用程序都是在此基础上构成的。MFC具有以下特点:完全支持所有的Windows函数、控制、消息、GDI基本图形函数、菜单以及对话框。使用与传统的Windows API同样的命名规则,因此,一个类所能完成的工作可直接从名字得知。不使用容易产生错误的switchcase语句。所用的消息都映射到类中成员函数,这种直接的消息到方法的映射对所有消
49、息都适用。通过发送有关对象信息到文件的能力,来提供更好的判断支持。也可以确认成员变量。提供很多意外处理,减少错误。在运行时确定数据对象的设计,这允许实例化类时动态操作各域。代码少,速度快。三大基类:大多数MFC类是从三个基类(Base Class)派生的:CObject、CCmdTarget和CWnd。4.2 根类:CObjectCObject提供以下的基本服务:支持序列化(serialization support)运行时(Run-time)类的信息 对象诊断输出(object diagnostic output)与容器类兼容(compatibility with collection cl
50、asses)4.3 MFC应用程序框架结构类 用于构造框架应用程序的结构;提供多数应用程序公用的功能;组成框架的类对象组合成一个Windows应用程序工作框架。主要的组成对象有:一个从类CWinApp派生出的应用程序对象;一个或多个从类CDocument派生出的文档对象 一个或多个从类CView派生出的视对象 4.3.1 CWinApp类CWinApp类层次关系图:4.3.2 CDocument类 CDocument类层次关系:4.3.3 CView类 CView类的层次关系:4.3.3 CView类(续)视图类负责显示、描述、操作、编辑文档类的内容。CView中有个指针型的成员变量指向所依附