西安石油大学大二上C++面向对象程序设计课件第10章MFC编程1208修改Word格式文档下载.docx
- 文档编号:22084358
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:54
- 大小:739.44KB
西安石油大学大二上C++面向对象程序设计课件第10章MFC编程1208修改Word格式文档下载.docx
《西安石油大学大二上C++面向对象程序设计课件第10章MFC编程1208修改Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西安石油大学大二上C++面向对象程序设计课件第10章MFC编程1208修改Word格式文档下载.docx(54页珍藏版)》请在冰豆网上搜索。
应用程序文档的基类
CView
查看文档数据的应用程序视图的基类
CDialog
所有对话框(模态或者非模态)的基类
CFile
提供二进制磁盘文件的访问接口
CDC
设备上下文类的基类,封装了绘图的所有功能函数
CException
所有异常的基类,用于处理各种异常
10.2用MFCAppwizard自动生成Windows程序
VisualC++集成开发环境中提供的MFCAppwizard(MFC应用程序向导)可以生成一些常用的标准程序结构,方便了用户自动生成MFC派生类的消息映射和重载相应的消息处理成员函数。
用户只需编写少量的程序代码就能够实现具有强大功能的应用程序,从而大大简化了Windows应用程序的编写工作量,提高了编程效率。
.2.1应用程序框架
应用程序框架通常是指一个完整的程序模型,具备标准应用软件所需的一切基本功能,如档案存取、打印预览等,以及这些功能的使用接口,如工具栏、状态栏、菜单等。
应用程序框架的定义是:
“提供一个一般应用程序所需要的全部面向对象软件组件的集合”,即它是整个应用程序的可重用集合。
如果把一个应用程序看作由“骨架”和“肉”组成,则这里的“肉”指的是程序中用于解决问题的部分,而“骨架”就是“肉”所依附的程序框架部分,在“骨架”上即使没有附着任何东西,仍可以严格地按照设计运行。
应用程序框架负责提供程序的结构框架,开发人员在此基础上为其添加相应的实现代码,从而可以非常方便地完成一个完整的应用程序。
应用程序框架可以在具有相似需求的多个系统中得到重用,这比代码级的重用具有更大的意义。
常见用于C++编程的应用程序框架除MFC外,还有BorlandC++的OWL(ObjectWindowLibrary),BorlandC++Builder的VCL(VisualComponentLibrary)等。
在VisualC++中,MFC应用程序框架分为两类:
基于文档/视图结构的应用程序框架和基于对话框的应用程序框架。
1.基于文档/视图结构的应用程序框架
一个最简单的单文档/视图结构应用程序的用户界面如图10.2所示。
图10.2一个文档/视图结构的用户界面
【例10.1】实现如图10.2所示的文档/视图结构应用程序的用户界面。
启动VisualC++,按以下步骤创建一个单文档界面工程S1。
不添加任何代码,仅仅是一个单文档界面应用程序框架。
1选择File|New菜单项,弹出New对话框,选择Projects标签,选中MFCAppWizard(exe)类型,在Location编辑框中输入要创建工程的目录,或者点击编辑框右边的省略号按钮选择一个已有的目录,在Projectname编辑框中输入要建立的工程名称。
这里选定目录为E:
\Samples,工程名为S1,如图10.3所示。
图10.3New对话框
注意工程名自动附加在了路径后面,Createnewworkspace一项默认选中,按“OK”按钮继续。
2弹出MFCAppWizard-Step1向导对话框,如图10.4所示。
图10.4MFCAppWizard-Step1对话框
可创建工程有三种类型:
♦单文档(Singledocument)界面应用程序(简称SDI)
♦多文档(Multipledocument)界面应用程序(简称MDI)
♦基于对话框(Dialogbased)的应用程序
默认选项是MDI,左边的示意图表示所选类型的界面。
将其改选为SDI。
可以看到选项改变时左边的示意图也随之变化。
Document/Viewarchitecturesupport?
一项默认选中,表示应用程序采用文档-视图结构,将会在自动生成的程序中支持CDocument派生类的Serialize成员函数的操作。
至于该对话框中选择资源语种一项,使用默认的中文。
按“Next”按钮,进入下一步。
3弹出MFCAppWizard-Step2of6对话框,如图10.5所示。
图10.5MFCAppWizard-Step2of6对话框
取默认选项,即不支持数据库。
4弹出MFCAppWizard-Step3of6对话框,如图10.6所示。
图10.6MFCAppWizard-Step3of6对话框
这一步是选择程序在OLE方面的支持,取默认选项。
5弹出MFCAppWizard-Step4of6对话框,如图10.7所示。
图10.7MFCAppWizard-Step4of6对话框
在这一步中可以选择程序在用户界面方面的功能,如工具栏、状态栏、打印和打印预览、上下文相关帮助、工具栏的类型以及程序中文件菜单下可以列出的最近使用的文件个数。
如果按Advanced…按钮,则弹出AdvancedOptions对话框,它有两个标签。
在DocumentTemplateStrings标签下可以输入程序能处理的文件的扩展名以及更改程序窗口的标题等,如图10.8所示。
在WindowsStyles标签下可以设置程序窗口的风格,如有无系统菜单、有无最大化、最小化按钮等,如图10.9所示。
图10.8AdvancedOptions对话框的DocumentTemplateStrings标签
图10.9AdvancedOptions对话框的WindowsStyles标签
本例子中不改变默认选项,按“Next”按钮,进入下一步。
6弹出MFCAppWizard-Step5of6对话框,如图10.10所示。
图10.10MFCAppWizard-Step5of6对话框
在这个对话框中可以设置工程风格是MFC标准式或是Windows浏览器式,可以设置是否在源程序代码中加入注释,以及如何使用MFC库(是将其作为共享动态链接库还是静态链接库使用)。
不改变默认选项,按“Next”按钮,进入下一步。
7弹出MFCAppWizard-Step6of6对话框,如图10.11所示。
在该对话框的列表框中,可以看到MFCAppWizard将要产生的四个类的名称:
视图类CS1View、应用类CS1App、主边框窗口类CMainFrame、和文档类CS1Doc。
在下面的几个编辑框内,可以修改各个类默认的类名、类的头文件和实现文件名。
对于视图类还可以修改其基类名称,默认的基类是CView。
图10.11MFCAppWizard-Step6of6对话框
不改变默认设置,按“Finish”按钮。
8弹出NewProjectInformation对话框,如图10.12所示。
图10.12S1工程的NewProjectInformation对话框
在该对话框中列出了所建工程的一些信息,如应用程序的类型、将要创建类的名称及其头文件和实现文件、应用程序的界面功能、工程的目录等。
单击“OK”按钮,则VisualC++开始创建一个工程,生成了一个基于SDI的应用程序框架。
此时工作区中有三个标签:
ClassView,ResourceView和FileView,展开它们即可看到系统生成的工程的类的组成、资源组成和文件组成。
分别展开ClassView标签和FileView标签中的结点,可以看到在MFCAppWizard-Step6of6中生成的S1工程的4个类及其对应的头文件和实现文件,图10.13(a)为S1工程的类视图,图10.13(b)为S1工程的文件视图。
(a)类视图(b)文件视图
图10.13S1工程工作区
选择Build|ExecuteS1.exe菜单项或者按Ctrl+F5键,运行程序,可得到如图10.2所示的运行结果。
说明:
(1)系统默认工程名的修改方法
在例10.1中,系统默认以工程名S1作为主窗口标题,用户可以根据需要进行修改。
修改方法有多种,这里仅介绍一种。
系统默认工程名修改的操作步骤:
1在工作区中选择“ResourceView”标签,展开各资源项。
2打开“StringTable”文件夹,双击包含的“StringTable”项,在客户区会看到表中的内容。
3在ID为“IDR_MAINFRAME”上双击,将打开“StringProperties”对话框。
4在Caption编辑框中修改第一个“\n”前的字符串为要设置的应用程序标题。
例如:
将“S1”修改为“测试一”。
在应用程序类的InitInstance函数中,当创建文档模板时系统会加载该资源。
(2)SDI应用程序的组成
一个SDI应用程序只有一个窗口,一次只能加载一个文档,Windows的“记事本”应用程序是一个典型SDI应用程序的例子。
以S1工程为例,一个典型的SDI应用程序一般由四个类组成:
♦主框架窗口类(CMainFrame)
基类是CFrameWnd,框架类负责管理程序的主窗口,包含窗口边框、标题栏、菜单栏、系统菜单栏、工具栏、状态栏等各种元素。
CFrameWnd类也是所有框架窗口类(例如CMDIFrameWnd类和CMDIChildWnd类)的基类。
在基于SDI的应用程序中,AppWizard会自动添加一个继承自CFrameWnd类的CMainFrame类作为主框架窗口类,也是当前文档对应的视图的边框,是所有MDI/SDI子窗口的包容器。
该类的定义和实现文件分别是MainFrm.h和MainFrm.cpp。
在MDI应用程序中会包含子框架窗口类CChildFrame,该类的定义和实现文件分别是ChildFrm.h和ChildFrm.cpp。
♦应用程序类(CS1App)
基类是CWinApp,应用程序类是应用程序运行的基础,用来管理整个应用程序,封装了Windows应用程序要做的初始化、运行和终止三大主要任务。
该类的定义和实现文件分别是S1.h和S1.cpp。
♦文档类(CS1Doc)
基类是CDocument,文档类封装了应用程序的数据管理功能,负责存放程序数据、读出数据并进行I/O操作。
该类的定义和实现文件分别是S1Doc.h和S1Doc.cpp。
♦视图类(CS1View)
基类是CView,视图类负责管理视图窗口,显示程序中的数据和处理用户输入,而数据是从文档类中获得,视图窗口是框架窗口的子窗口,显示在主框架窗口的客户区中。
该类的定义和实现文件分别是S1View.h和S1Viw.cpp。
在MDI应用程序中,除了具有SDI应用程序中的四个类外,还包括子框架窗口类。
此时主框架窗口类的基类为CMDIFrameWnd类,它管理程序的主窗口,但不包含单个视图窗口,子框架窗口(文档框架窗口)类的基类为CMDIChildWnd类,它管理程序的子窗口,一个子框架窗口的客户区显示一个打开文档的视图窗口。
一个MDI应用程序一次可打开多个文档,每个文档在不同的子窗口内显示,MicrosoftWord就是一个典型MDI应用程序的例子。
2.基于对话框结构的应用程序框架
对话框可以用来输出显示程序的运行结果或其他需要的信息,一个对话框结构应用程序的用户界面例子如图10.14所示。
图10.14一个对话框结构的用户界面
【例10.2】实现如图10.14所示的用户界面。
操作步骤:
1类同例10.1中的第一步,工程保存在E:
\Samples\S2中。
2在弹出的如图10.4所示的MFCAppWizard-Step1向导对话框中,选择“Dialogbased”选项,单击“Next”按钮。
3弹出MFCAppWizard-Step2of4对话框,如图10.15所示。
图10.15MFCAppWizard-Step2of4对话框
在该对话框中,可以给应用程序增加一些特性,如包含“关于”对话框、上下文相关帮助、3D控件。
可以使应用程序支持OLE自动化功能,以及增加WOSA(Windows开放式系统体系结构)支持,允许应用程序通过TCP/IP网络进行通信。
另外还可以在这一步中输入对话框标题,默认为“S2”。
不改变默认设置,单击“Next”按钮。
4弹出MFCAppWizard-Step3of4对话框,如图10.16所示。
图10-16MFCAppWizard-Step3of4对话框
在该对话框中,选择是否要在代码中添加注释,以及选择MFC是静态还是动态链接到应用程序中。
把MFC静态链接到应用程序中可以减少发布应用程序时必须分发的文件的数量,但缺点是应用程序比较庞大,而且在加载时占用较多的内存。
默认设置为以共享动态链接库的方式使用MFC。
5弹出MFCAppWizard-Step4of4对话框,如图10.17所示。
图10.17MFCAppWizard-Step4of4对话框
在该对话框的列表框中,可以看到MFCAppWizard将要产生的两个类的名称:
应用类CS2App、对话框类CS2Dlg。
在下面的几个编辑框内,可以修改这两个类的类名,还可以修改对话框类的头文件和实现文件名。
不改变默认设置,单击“Finish”按钮。
6弹出NewProjectInformation对话框,如图10.18所示。
图10.18NewProjectInformation对话框
在该对话框中列出了工程的说明信息,如应用程序的类型、将要创建的类的名称及其头文件和实现文件、应用程序的界面功能、工程的目录等。
单击OK按钮,将生成一个基于对话框的应用程序框架,在工作区中可以浏览工程的类的组成、资源组成和文件组成。
运行程序,即可得到如图10.14所示的用户界面。
该应用程序的标题默认为工程名S2,用户可以在工作区中单击“ResourceView”标签,展开“Dialog”结点,双击打开“IDD_S2_DIALOG”资源,并在其上单击鼠标右键,在快捷菜单中单击“Properties”菜单项,打开对话框属性对话框,在General标签中修改Caption的值。
3.工程的文件组成
使用MFCAppWizard自动创建的工程目录(如上面的E:
\Sample\S1)通常包含Debug、res两个目录和其他一些文件,其中Debug目录用于存放编译、链接时产生的中间文件和可执行文件,res目录用于存放工程的资源文件。
VisualC++默认产生的是debug版本的执行程序,可以通过Build|SetActiveConfiguration…菜单项来设置当前版本的类型。
下面以例10.1的S1工程为例,说明工程中一些主要文件的内容和作用。
(1)工程文件
♦S1.dsw:
工作区文件,保存了工程所属的工作区信息。
♦S1.dsp:
工程文件,保存了用户所建工程的有关信息
♦S1.opt:
工作区选项文件,保存了用户为所建工作区所定制的一些选项,当每次打开该工作区时可自动设置用户定制的选项状态。
♦S1.clw:
为ClassWizard数据库文件,存放由ClassWizard使用的信息,Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射、以及创建成员函数的原型。
♦S1.ncb:
非编译的浏览文件,包含了由分析器产生的一些信息,可被ClassView、WizardBar和ComponentGallery利用。
(2)预编译头文件
♦StdAfx.h和StdAfx.cpp:
这两个文件用来产生预编译头文件S1.pch和一个OBJ文件StdAfx.obj。
StdAfx.h包含了标准的系统包含文件以及工程中频繁使用但很少改动的包含文件,如afxwin.h、afxext.h、afxdisp.h等,将这些文件预编译,产生预编译头文件,可以节省每次编译的时间。
(3)资源文件
♦S1.rc和Resource.h:
工程的主要资源文件及其头文件。
资源文件包含了一般MFC应用程序用到的所有资源,如菜单、加速键、字符串表以及About对话框、图标文件、位图文件。
♦res\S1.rc2:
工程的资源文件,包含VisualC++不能直接编辑的资源,可以将所有不能由资源编辑器编辑的资源放置到这个文件中。
♦res\S1.ico:
图标文件,作为应用程序的图标,包含在资源文件S1.rc中。
♦res\S1Doc.ico:
图标文件,作为应用程序所处理的文件类型的图标。
♦res\Toolbar.bmp:
用于创建工具栏按钮的位图文件。
(4)帮助文件
若用户在MFCAppWizard-Step4of6对话框中选择了“提供上下文相关帮助”,则会在工程目录上生成一个hlp子目录,并产生一系列所需帮助文件。
.2.2MFC消息映射
在MS-DOS的控制台应用程序中,main函数是程序的入口,按照程序语句的执行流程来控制程序代码的执行。
执行的顺序和方式是在编写程序时设置好的,这种程序模式称为过程控制模式。
在Windows环境中,无论系统产生的动作还是程序运行时用户产生的动作都称为事件,如用户单击鼠标、窗口移动、按键等都是一个个事件。
消息是描述事件发生的信息。
例如当用户单击鼠标时,Windows会给相应的窗口发送消息,发送的消息中包含了消息的类型,单击时鼠标的位置等信息。
Windows程序是事件(或者消息)驱动的,程序的控制流程不再由事件的预定发生顺序来决定,而是由实际运行时各种事件的实际发生来触发,而事件的发生可能是随机的、不确定的,并没有预定的顺序。
Windows环境和应用程序都是通过消息来交互的。
1.Windows消息机制
操作系统将感知到的事件传递给应用程序是通过消息机制来实现的,Windows消息可分为三种类型:
♦标准Windows消息:
以WM_为前缀的消息(除WM_COMMAND)。
♦控件通知消息:
以WM_COMMAND为消息名,由编辑框、列表框等控件或子窗口发给其父窗口的通知消息。
♦命令消息:
当用户选择菜单、工具栏、加速键时产生的消息,也以WM_COMMAND为消息名,在消息中包含有命令的标识符(ID),以区分具体的命令。
操作系统将每个事件包装成一个称为消息的固定结构传送给应用程序,在winuser.h中定义消息的数据结构为MSG结构体,其代码结构如下:
typedefstructtagMSG
{
HWND
hwnd;
UINT
message;
WPARAMwParam;
LPARAMlParam;
DWORD
time;
POINT
pt;
}MSG;
其中:
♦hwnd是接收消息的窗口函数所属的窗口句柄(WindowHandle),所谓句柄就是资源的标识,操作系统通过句柄找到对应的资源,给每一个窗口指定的唯一的标识号就是窗口句柄。
♦message是一个无符号整型值,用来表示消息的类型。
在VisualC++中系统定义了以WM_开头的宏来表示一个整数,因此通常用这样一个宏来表示一个Windows消息。
♦wParam和lParam都是32位的整型数,保存消息的附加信息。
例如,当在键盘上按下任意一个字母键时,都会产生一个WM_CHAR消息,如果按下一个字母A键,为了确定具体的按键字符信息,需要将字母A的ASCII码放在附加参数wParam和lParam中。
♦time是32位的一个整数,表示消息发送的时间。
♦pt是消息发送时光标在屏幕上的位置。
POINT也是一个结构体,它在windef.h中定义如下:
typedefstructtagPOINT
LONG
x;
y;
}
POINT;
Windows中有一个系统消息队列。
另外,对于每一个正在执行的Windows应用程序,系统为其建立一个消息队列,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。
队列是一个“先进先出”的缓冲区,通常是某种数据类型的数组。
每个窗口会有一个称为窗口过程(WndProc)的回调函数,它带有四个参数,分别为:
窗口句柄,消息ID(MessageID),和两个消息参数(wParam,lParam),当窗口收到消息时系统就会调用此窗口过程来处理消息,即消息响应。
任何一个窗口类都有一个窗口过程,同一个类的窗口使用同样的窗口过程来响应消息。
Windows消息从产生到响应处理的过程如图10.19所示。
图10.19Windows消息机制
把消息传送到应用程序有两种方法:
♦由系统将消息post到应用程序的“消息队列”,这是“进队消息”,Win32API有对应函数PostMessage,此函数不等待该消息处理完就返回。
♦由系统在直接调用窗口过程时将消息send给应用程序的窗口过程,属于“不进队消息”,对应函数是SendMessage,此函数必须等待该消息处理完后方可返回。
应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口过程中。
消息循环过程代码如下:
while(GetMessage(&
msg,NULL,0,0))
{
if(!
TranslateAccelerator(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安石油 大学 大二 C+ 面向 对象 程序设计 课件 10 MFC 编程 1208 修改
链接地址:https://www.bdocx.com/doc/22084358.html