版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章文档视图结构5.1文档视图结构概述5.2创建文档/视图应用程序思考题
5.1文档视图结构概述
5.1.1文档和视图
文档与视图是MFC应用程序的核心。Windows应用程序除了处理数据外,还要将数据显示出来。在Windows界面下,数据的显示并非使用cin或cout指令。MFC采用了两个相互独立的类:CDocument类(文档类)和CView类(视图类)来负责数据的存储与显示。在文档-视图结构中,文档是应用程序数据基本元素的集合,它构成应用程序所使用的数据单元。另外它还对数据进行管理和维护,通常数据被保存在文档类的成员变量中。文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但也可以不是磁盘文件,文档的数据源也可以来自串行口、网络或摄像机输入信号等。
文档类通过一个称为串行化(serialize)的过程将数据保存到磁盘文件或数据库中。MFC类库为数据的串行化提供了默认的支持,只要在此基础上进行修改,就可以为自定义的文档类提供串行化支持。文档类还可以处理命令消息,这些命令消息可以来自菜单、工具栏按钮和快捷键的WM_COMMAND消息。除该类消息外,文档不能处理其他Windows的消息。视图是数据的用户窗口,为用户提供了文档的可视数据显示,它把文档的部分或全部内容在窗口中显示出来。视图还给用户提供与文档中的数据交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会有一个或多个视图显示,一个文档可以对应多个视图,而一个视图只能对应一个文档,视图只负责实现和修改文档数据,不负责存储。视图像一个用户接口,将文档类的数据取出来,在屏幕上进行显示。同时它可以接受用户的输入、修改操作,但实际的存储活动仍然由文档类完成。另外视图还可以直接或间接地访问文档类中的成员变量,并通过这种方式来显示和更新数据。
VisualC++6.0向用户提供了两种基于文档与视图类型的应用程序:单文档界面(SDI)和多文档界面(MDI)程序。在单文档界面(SDI)应用程序中,用户在同一时刻只能操作一个文档。像Windows下的“记事本”程序就是这样的例子。在这类应用程序中,打开文档时会自动关闭当前打开的活动文档,若文档修改后尚未保存,会提示是否保存所做的修改。因为一次只能打开一个窗口,所以不像MicrosoftWord那样需要一个“窗口”菜单。单文档应用程序一般都提供一个File菜单,在该菜单下有一组命令,用于新建文档(New)、打开已有文档(Open)、保存或换名存盘文档等。这类程序相对比较简单,常见的应用程序有终端仿真程序和一些工具程序。多文档界面(MDI)应用程序也能操作文档,并允许同时操作多个文档。如MicrosoftWord。可以打开多个文件,可以通过切换窗口激活相应的文档进行编辑。多文档应用程序也提供一个File菜单,用于新建、打开、保存文档。其与单文档应用程序不同的是,它往往还提供一个关闭(Close)菜单项,用于关闭当前打开的文档。多文档应用程序还提供“窗口”菜单,管理所有打开的子窗口,包括对子窗口关闭、层叠、平铺等。关闭一个窗口时,窗口内的文档也被自动关闭。5.1.2基本程序结构
文档/视图结构是VisualC++6.0语言中使用的MFC开发应用程序的基本框架。在这个框架中,数据的维护及其显示是由两个不同但又彼此紧密相关的类——文档类和视图类分别负责的。
总的来讲,采用文档与视图结构的应用程序由以下四个部分组成:
1.文档类(CDocument)
负责应用程序数据的管理。它是所有应用程序文档类的基类,提供了文档类所需要的最基本功能实现的手段,为文档对象与框架窗口对象、视图对象等的交互提供了基本的框架。
2.视图类(CView)
负责用户与文档之间的交互。它通过一个指向其对应的文档对象的指针,可以直接或间接地获取和修改文档中的数据。该指针在视图类创建时即生成。
3.框架结构类(CFrame)
MFC应用程序使用框架来包括应用程序中的视图,主框架是应用程序的主窗口,子框架则提供了一个视图窗口,每个视图都能在其中运行。此外,框架对象还为应用程序处理菜单、状态栏和工具栏,并接受视图中的命令消息。
4.主应用程序类(CWinApp)
负责启动程序的运行和处理程序与Windows之间的数据交互,它控制所有其他的类。
有了以上文档与视图中的四个主要的类,就可以用它们来建立任意类型的Windows程序和框架结构。
通常情况下,视图通过GetDocument成员函数获得指向相关联的文档对象的指针,并通过该指针调用文档类的成员函数来从文档中读取数据。视图将数据显示在计算机屏幕上,用户通过与视图的交互来查看数据并对数据进行修改。视图通过相关联的文档类成员函数将经过修改的数据传递给文档对象。文档对象获得修改过的数据后,将其保存到存储设备中。对数据进行读取、显示、存储时,在文档、视图和应用程序框架间有一系列复杂的相互作用过程,文档与视图间的交互是通过类的公有成员变量和函数来实现的。5.1.3框架窗口
框架窗口是每个Windows应用程序窗口的“门面”,它容纳着视图窗口,管理和控制应用程序的外观。框架窗口本身的一些常规操作如最大化/最小化、移动窗口、改变窗口大小等,都是由Windows操作系统自动管理的,而处于框架窗口内的一些界面元素(如工具栏、状态栏等)一般由框架窗口类来管理和控制。
每一个基于文档/视图结构的应用程序都有一个自己的应用程序窗口,即该程序的最外围窗口。相应的应用程序图标、工具栏、状态栏等都在此窗口中显示。基于文档/视图结构的应用程序有单文档和多文档之分(这在前面已提到过)。单文档应用程序(SDI)只有一个框架窗口,该框架窗口也是文档窗口。视图类的所有输出都显示在这个视图窗口中,通过窗口的隐藏和叠合,应用程序框架可以将文档独立地显示在另一个视图类中。即单文档应用程序可以有多个视图,但只有一个视图是当前活动和可视的。
多文档应用程序(MDI)对于每一个打开的文档,都在框架窗口内创建一个新的文档框架窗口。即多文档应用程序可以有多个视图对应多个文档,且各视图都是可视和活动的。
SDI应用程序的框架窗口是从CFrameWnd类派生的。在创建应用程序框架时,MFC应用程序向导会自动为该程序派生一个应用程序框架窗口类,其缺省名为CMainFrame,相应的文件为“MainFrame.h”和“MainFrame.cpp”。
MDI应用程序的框架窗口类也是CMainFrame类,但它是由CMDIFrameWnd类派生的,不是SDI程序中的CFrameWnd类,其相应的文件也是“MainFrame.h”和“MainFrame.cpp”。而增加的文档框架窗口类则是由CMDIChildWnd类派生的,其相应的实现文件为“ChildFrm.h”和“ChildFrm.cpp”。通过比较SDI应用程序与MDI应用程序框架窗口类能够看出,尽管两者框架窗口类的父类不同,但它们类的函数接口完全一致,其功能上的不同是隐含实现的。
框架窗口的风格可以通过修改其类中的PreCreateWindow函数来实现。
应用程序框架窗口类和文档框架窗口类的主要作用是承担与文档无关的一些程序外观和控制任务,而文档的维护管理和显示等任务则是由文档类和视图类来实现的。
5.2创建文档/视图应用程序
本节将分别建立基于单文档(SDI)的应用程序和基于多文档(MDI)的应用程序。
5.2.1创建单文档程序
下面介绍一个创建单文档程序的例子。一个文本编辑软件,正在编辑的文本文件的内容将显示在视图上,用户将在视图上对该文件进行编辑和修改。用户对当前文件的任何编辑和修改都会反映到文档的修改上。
【例5-1】
创建一个文本编辑器。
操作步骤如下:
(1)选择“文件/新建”命令,打开“新建”对话框,如图5-1所示。图5-1“新建”对话框
(2)选择选项卡,并在左边的项目类型列表框中选择
选项,在文本框中输入“文本编辑器”,并在文本框处选好项目保存的位置,单击
按钮,打开“MFCAppWizard-Step1”对话框,如图5-2所示。
(3)在“MFCAppWizard-Step1”对话框中选中
单选项,并确认复选框被选中。如果不选中它,则MFCAppWizard就不会自动为文档/视图结构生成代码了。单击按钮,显示“MFCAppWizard-Step2of6”对话框,如图5-3所示。图5-2“MFCAppWizard-Step1”对话框图5-3“MFCAppWizard-Step2of6”对话框
(4)在“MFCAppWizard-Step2of6”对话框中,询问是否要加入对数据库访问的支持,因为不需要支持数据库,所以选中单选项,如图5-3所示。单击按钮,显示“MFCAppWizard-Step3of6”对话框,如图5-4所示。
(5)在“MFCAppWizard-Step3of6”对话框中,询问是否需要复合文档的支持,因为不需要支持,所以选中
单选项,如图5-4所示。单击按钮,显示“MFCAppWizard-Step4of6”对话框,如图5-5所示。图5-5“MFCAppWizard-Step4of6”对话框
(6)在“MFCAppWizard-Step4of6”对话框中,其选项关系到生成的应用程序窗口外观的风格。在下有七个复选框,它们分别是:
①:是否可以在应用程序窗口中隐藏工具栏。
②:是否一打开应用程序窗口就显示状态栏。
③:是否在程序中自动加入对打印和打印预览的支持。
④:是否在程序中加入对上下文帮助功能的支持。
⑤:是否使用三维风格的控件。
⑥:是否在程序中自动加入对MAPI的支持。⑦:是否在程序中自动加入对WindowsSockets的支持。
其中,最后两项与网络编程有关。
在问题下有两个单选项:
①:选择普通风格的工具栏。
②:选择InternetExplorer浏览器风格的工具栏。
在下的文本框中要求程序员输入的是:在自动生成的程序框架中,为“文件”菜单下的“最近打开的文件”预留多少个位置。
(7)在本程序中,只需使用“MFCAppWizard-Step4of6”对话框中提供的默认值即可。单击按钮,显示“MFCAppWizard-Step5of6”对话框,如图5-6所示。图5-6“MFCAppWizard-Step5of6”对话框
(8)在“MFCAppWizard-Step5of6”对话框中,同样选择其提供的默认值即可。单击按钮,显示“MFCAppWizard-Step6of6”对话框,如图5-7所示。
(9)在“MFCAppWizard-Step6of6”对话框中,除在下拉列表框中选择外,其他均选择其提供的默认值即可。单击按钮,显示“新建工程信息”对话框,如图5-8所示。
(10)在“新建工程信息”对话框中将显示VisualC++6.0提示程序员即将生成的程序框架信息。单击按钮,即生成一个具有文本编辑功能的应用程序,如图5-9所示。图5-7“MFCAppWizard-Step6of6”对话框图5-8“新建工程信息”对话框图5-9生成“文本编辑器”工程
(11)编译运行“文本编辑器”工程。选择5-9图中菜单中的,编译“文本编辑器”工程,菜单中的,运行“文本编辑器”工程。即生成如图5-10所示的文本编辑器应用程序。
从以上例子可以看出,并不需要为这个例子编写任何代码,通过CEditView类内建的对文本编辑功能的支持,使得在视图中进行文本编辑成为可能,而AppWizard实际上又添加了对文本文件的读写功能,它同由CEditView派生的类紧密结合,完成了整个文本编辑器的功能。图5-10“文本编辑器”应用程序5.2.2创建多文档程序
创建多文档应用程序与创建单文档应用程序的过程基本相同。
操作步骤如下:
(1)选择“文件/新建”命令,打开“新建”对话框,如图5-11所示。
(2)选择选项卡,并在左边的项目类型列表框中选择
选项,在文本框中输入“MDI文本编辑器”,并在文本框处选好项目保存的位置,单击按钮,打开“MFCAppWizard-Step1”对话框,如图5-12所示。图5-11“新建”对话框图5-12“MFCAppWizard-Step1”对话框
(3)在“MFCAppWizard-Step1”对话框中选中单选项,并确认复选框被选中。单击按钮,进入“MFCAppWizard-Step2of6”。
(4)此后的操作步骤与4.2.1小节中创建单文档应用程序的步骤相同。
(5)在“MFCAppWizard-Step6of6”对话框中,多文档应用程序创建的界面如图5-13所示。
提示:在操作过程中,除可以修改视图类名称、应用程序名称、框架类名称和文档类名称(方法同创建单文档应用程序)外,还可以修改子框架类名称和文件。子框架类的缺省为CChildFrame,其基类为CMDIChildWnd,且不可修改。头文件和源文件名称可以修改。图5-13“MFCAppWizard-Step6of6”对话框
(6)按5.2.1小节中创建单文档应用程序的方法编译运行“MDI文本编辑器”工程。即生成如图5-14所示的MDI文本编辑器应用程序。
提示:在多文档应用程序中,增加了菜单,单击该菜单下的命令项,则生成一个新的框架窗口,其名称按前面的名称递增,如图5-15所示。图5-14“MDI文本编辑器”应用程序图5-15新建窗口框架界面5.2.3文档程序分析
单文档(SDI)应用程序和多文档(MDI)应用程序的差异较大,最明显的差异是框架窗口的不同。对单文档(SDI)应用程序来说,框架窗口是指惟一的主框架窗口,其缺省类为CMainFrame,其基类为CFrameWnd,其框架窗口类直接包含有视图。对多文档(MDI)的应用程序来说,框架窗口分为主框架窗口和子框架窗口。与单文档不同的是,多文档的主框架窗口不直接包含视图,而是由每个子框架窗口包含相应的视图。因此,多文档的主框架类不与某个文档相关联,只与子框架窗口相关联。多文档主框架窗口类的缺省类为CMainFrame,是由CMDIFrameWnd类派生而来的,子框架窗口类的缺省类为CChildFrame,是由CMDIChildFrame类派生而来的。单文档(SDI)应用程序和多文档(MDI)应用程序另一不同之处在于使用文档的模板不同。文档模板的作用是建立文档类、视图类以及框架窗口类之间的相互联系。单文档(SDI)应用程序使用CSingleDocTemplate模板,而多文档(MDI)应用程序使用的是CMultiDocTemplate模板。
本章主要讲述了基于文档/视图结构的应用程序的基本结构、框架窗口类、文档类、视图类的基本知识,并在此基础上创建了单文档(SDI)应用程序和多文档(MDI)应用程序。通过本章的学习,读者应掌握文档/视图结构应用程序的基本构成,掌握文档类、视图类以及框架窗口类之间的联系方法,能够理解并在程序编写过程中正确处理文档类对象与视图类对象的分工合作。5.2.4节中将介绍一个实例。本实例将建立一个文档视图类的应用程序——阅读器。此阅读器可以用来打开*.txt的文件。通过该练习,读者可掌握如何创建一个文档视图类的应用程序,并为其添加一简单菜单项,以方便用户阅读序列编号的txt文件。5.2.4创建文档视图类应用程序
操作步骤如下:
(1)在Windows的“开始”菜单中选择“所有程序/MicrosoftVisualStudio6.0/MicrosoftVisualC++6.0”命令,启动VisualC++6.0,如图5-16所示。
(2)选择“文件/新建”命令,打开“新建”对话框,如图5-17所示。
(3)选择选项卡,并在左边的项目类型列表框中选择
选项,在文本框中输入“阅读器”,并在文本框处选好项目保存的位置,单击按钮,打开“MFCAppWizard-Step1”对话框,如图5-18所示。图5-16Access窗口图5-17打开“新建”对话框图5-18“MFCAppWizard-Step1”对话框
(4)在“MFCAppWizard-Step1”对话框中选中单选项,并确认复选框被选中。单击
按钮,以后步骤参照5.2.1节执行,直到出现5-19所示对话框。
(5)在“新建工程信息”对话框中将显示VisualC++6.0提示程序员即将生成的程序框架信息。单击按钮,即生成一个具有阅读器功能的应用程序,如图5-20所示。
(6)编译运行“阅读器”工程,结果如图5-21所示。
(7)此阅读器现在已具有打开文件的功能了。选择“文件/打开”命令,如图5-22所示。图5-19“新建工程信息”对话框图5-20生成“阅读器”工程图5-21“阅读器”应用程序图5-22“打开”对话框
(8)打开“阅读器”目录下的2.txt,如图5-23所示。
注意:在使用阅读器打开文件之前,请确保你的“阅读器”目录下有“2.txt”文件。
此阅读器已基本成型,具有打开文件的基本功能了。这些工作大部分都是应用程序向导(AppWizard)完成的,所以不需要编写一句代码。接下来将继续完善该程序,增加连续打开文件的功能。图5-23打开2.txt5.2.5添加菜单
打开菜单资源进行编辑。
操作步骤如下:
(1)选择“Workspace”窗口的选项卡,出现资源视图,展开目录树项,如图5-24所示。
(2)点击选项旁边的,如图5-25所示。
(3)双击选项,出现菜单编辑器,如图5-26所示。
(4)双击菜单栏右边的,出现MenuItemProperties对话框,在文本框中输入“浏览(&B)”,如图5-27所示。图5-24资源视图图5-25展开menu选项图5-26菜单编辑器图5-27“MenuItemProperties”对话框
(5)按回车键,如图5-28所示。
(6)双击菜单下的,再次出现MenuItemProperties对话框,在文本框中输入“ID_PRE”,在文本框中输入“上一文件(&P)”,在文本框中输入“顺序打开上一个编号的文件”,如图5-29所示。
(7)按回车键,如图5-30所示。
(8)双击菜单项下的,重复操作步骤(6),在文本框中输入“ID_NEXT”,在文本框中输入“下一文件(&N)”,在文本框中输入“顺序打开下一个编号的文件”,并按回车键,结果如图5-31所示。图5-28增加“浏览”菜单图5-29“上一文件”菜单属性图5-30“上一文件”菜单项图5-31“下一文件”菜单项
(9)为菜单项添加消息处理函数OnPre和OnNext。选择如图5-24所示的“Workspace”窗口的选项卡,出现类视图,展开目录树项,如图5-32所示。
(10)在选项处,单击鼠标右键,弹出的快捷菜单如图5-33所示。
(11)在弹出的快捷菜单中选择命令项,出现“NewWindowsMessageandEventHandlersforclassCMyDoc”对话框,从列表项中选择
,从列表项中选择,如图5-34所示。图5-32类视图图5-33CMyDoc的右键快捷菜单图5-34“添加消息处理函数”对话框
(12)单击按钮,出现“AddMemberFunction”对话框,如图5-35所示。
(13)单击按钮,此时又返回到“NewWindowsMessageandEventHandlersforclassCMyDoc”对话框,从
列表项中选择,从
列表项中选择,如图5-36所示。
(14)单击,出现“AddMemberFunction”对话框,如图5-37所示。
(15)单击按钮,出现代码编辑窗口,如图5-38所示。图5-35添加OnPre命令处理函数图5-36“添加消息处理函数”对话框图5-37添加OnNext命令处理函数图5-38代码编辑窗口
(16)在代码编辑窗口中编辑voidCMyView::OnPre()和voidCMyView::OnNext()函数,如图5-38所示。代码如下:
voidCMyView::OnPre()
{
CStringsFilename(GetDocument()->GetPathName());
//得到当前打开文档的路径名
CStringsTitle(GetDocument()->GetTitle());//得到当前打开文档的文件名
intnTitle=atoi(sTitle);
if((nTitle>1)&(nTitle<=3))
{
sTitle.Format("%d",nTitle-1);
intnFind=sFilename.ReverseFind('\\\\'); if(nFind>0)
{
CStringsNewFilename(sFilename.Left(nFind)+"\\\\"+sTitle+".txt");
AfxGetApp()->OpenDocumentFile(sNewFilename);
}
}
else
AfxMessageBox("没有上一文件了!");
}
voidCMyV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业阳光房设计与施工一体化协议版A版
- 专用商标使用许可协议版B版
- 专业SaaS服务提供商协议范本(2024修订版)版B版
- 专项咨询与解决方案服务协议版B版
- 二零二四全新旅游服务双向保密协议下载与体验合同3篇
- 二零二五年度绿色能源项目补充合同协议书2篇
- 2025年度城市综合体户外广告位及摊位联合租赁合同4篇
- 2025年休闲娱乐场地租赁合作协议书4篇
- 2025年度绿色能源项目场地承包经营合同范本4篇
- 二零二五年度自然人互联网金融消费合同3篇
- 2025年度土地经营权流转合同补充条款范本
- 南通市2025届高三第一次调研测试(一模)地理试卷(含答案 )
- 2025年上海市闵行区中考数学一模试卷
- 2025中国人民保险集团校园招聘高频重点提升(共500题)附带答案详解
- 0的认识和加、减法(说课稿)-2024-2025学年一年级上册数学人教版(2024)001
- 医院安全生产治本攻坚三年行动实施方案
- 法规解读丨2024新版《突发事件应对法》及其应用案例
- Python试题库(附参考答案)
- 大断面隧道设计技术基本原理
- 41某31层框架结构住宅预算书工程概算表
- 成都市国土资源局关于加强国有建设用地土地用途变更和
评论
0/150
提交评论