Visual C++面向对象与可视化程序设计_15.ppt
《Visual C++面向对象与可视化程序设计_15.ppt》由会员分享,可在线阅读,更多相关《Visual C++面向对象与可视化程序设计_15.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、16.1.1单文档界面与多文档界面单文档界面与多文档界面第第 16 16章章 单文档与多文档单文档与多文档 VCVC的的MFCMFC库支库支持三种不同持三种不同的应用程序的应用程序单文档界面单文档界面(SDI)多文档界面多文档界面(MDI)基于对话框的应用程序基于对话框的应用程序SDI的应用程序的应用程序只有一个窗口只有一个窗口MDI的应用程序每次的应用程序每次可以读写多个文件或可以读写多个文件或文档,可同时对多个文档,可同时对多个文档进行操作,可以文档进行操作,可以有多个子窗口有多个子窗口主主要要差差别别在创建在创建SDI界面的应用程序时,不生成界面的应用程序时,不生成CChildFrame
2、类,类,CMainFrame类的基类的基类为类为CFrameWnd在创建在创建MDI界面的应用程序时,界面的应用程序时,CMainFrame类的基类为类的基类为CMDIFrameWnd使用使用AppWizard创创建建SDI和和MDI界面的界面的应用程序的过程几应用程序的过程几乎完全一样乎完全一样1由于每一个文档可以有多个视图,但由于每一个文档可以有多个视图,但每个视图只能对应于一个确定的文档每个视图只能对应于一个确定的文档多文档程序需要解决的问题仅仅是多多文档程序需要解决的问题仅仅是多个文档的数据管理方法的问题个文档的数据管理方法的问题多文档程序,最初的文档模板只支持主窗口,但每次打开一多文
3、档程序,最初的文档模板只支持主窗口,但每次打开一个新文档时都调用个新文档时都调用CDocument的函数的函数OnNewDocument,建建立一个由立一个由CMDIChildWnd派生的新的派生的新的MDI子窗口,这些窗口子窗口,这些窗口中保存着各种已打开的文档,所有的细节都由中保存着各种已打开的文档,所有的细节都由MFC库处理库处理视图是文档的不同表现形式视图是文档的不同表现形式比如,一个比如,一个*.html语言的文语言的文件,在浏览器里和在记事本件,在浏览器里和在记事本中打开的表现形式是不同的中打开的表现形式是不同的但它们操作的是同一个文件但它们操作的是同一个文件这就是一个文档对应两视
4、图这就是一个文档对应两视图216.1.2 文档文档/视图结构视图结构在在文档文档/视图视图结构结构中中对数据进行管理和维对数据进行管理和维护,数据保存在文档护,数据保存在文档类的成员变量中类的成员变量中文档类文档类通过串行化通过串行化的过程将数据保存的过程将数据保存到磁盘文件或数据库中到磁盘文件或数据库中文档类文档类还可处理来自如还可处理来自如菜单、工具栏按钮和加菜单、工具栏按钮和加速键的速键的WM_COMMANDWM_COMMAND消息消息除除WM_COMMANDWM_COMMAND外,文档外,文档不不能能处理其它的处理其它的WindowsWindows消息消息由此我们可由此我们可以看出,命
5、以看出,命令消息可以令消息可以被多种对象被多种对象处理,这些处理,这些对象除了窗对象除了窗口和视图外,口和视图外,还可以是文还可以是文档、文档模档、文档模板或应用程板或应用程序本身序本身这一点与这一点与WindowsWindows消息消息和控件通知消息不同,和控件通知消息不同,因为因为WindowsWindows消息和控消息和控件通知消息就只能被件通知消息就只能被窗口和视图处理。窗口和视图处理。通过调用文档和视图的接口将修通过调用文档和视图的接口将修改的信息反馈给文档类,实际的改的信息反馈给文档类,实际的数据更新仍然是由文档来完成的数据更新仍然是由文档来完成的在文档和用户之在文档和用户之间起中
6、介作用间起中介作用视图可以直接或间接视图可以直接或间接的访问文档类中的成的访问文档类中的成员变量,它从文档类员变量,它从文档类中中(而不是从存储介质而不是从存储介质中中)将文档中的数据取将文档中的数据取出来,然后在屏幕上出来,然后在屏幕上显示文档的数据显示文档的数据它可以接收用户的输入它可以接收用户的输入,并接受用户的,并接受用户的修改修改3文档文档/视图结构的工作机制视图结构的工作机制视图通过视图通过GetDocumentGetDocument成员函数获得指向相关成员函数获得指向相关联的文档对象的指针联的文档对象的指针通过该指针调用文通过该指针调用文档类的成员函数来档类的成员函数来从文档中读
7、取数据从文档中读取数据视图把数据显示视图把数据显示于计算机屏幕上于计算机屏幕上用户通过与视图的用户通过与视图的交互来查看数据并交互来查看数据并对数据进行修改对数据进行修改视图通过相关联的文档类视图通过相关联的文档类的成员函数将经过修改的的成员函数将经过修改的数据传递给文档对象数据传递给文档对象文档对象获得文档对象获得修改过的文档对象获得文档对象获得修改过的数据之后,对其进行必要的修改,最数据之后,对其进行必要的修改,最后保存到永久介质后保存到永久介质(如磁盘文件如磁盘文件)中中416.2 文档类文档类5616.2.3 CDocument类的派生类构造类的派生类构造1.构造构造CDocument
8、类的派生类的基本步骤类的派生类的基本步骤一般来说,从一般来说,从CDocument类派生自己的文档类所需的典型步骤为类派生自己的文档类所需的典型步骤为l为每一个文档类型从为每一个文档类型从CDocument类类(当然也可以是其它当然也可以是其它CDocument类的派生类类的派生类)派生一个相应的文档类。派生一个相应的文档类。l为文档类添加成员变量。这些成员变量用来保存文档的为文档类添加成员变量。这些成员变量用来保存文档的数据,其它对象数据,其它对象(如与文档相关联的视图如与文档相关联的视图)直接或间接的访直接或间接的访问这些成员变量来读取或更新文档的数据。问这些成员变量来读取或更新文档的数据
9、。l重载重载Serialize成员函数,实现文档数据的串行化。成员函数,实现文档数据的串行化。716.3 视图类视图类816.3.3 CView类的派生类介绍类的派生类介绍1.1.CEditViewCEditView支持类似编辑控件所要实现的功能,常见的文本操作,基支持类似编辑控件所要实现的功能,常见的文本操作,基本上都是由该类支持实现的。值得注意的是,该类的直接本上都是由该类支持实现的。值得注意的是,该类的直接基类不是基类不是CView类,而是类类,而是类CCtrlView2.CRichEditView主要提供主要提供Rich文本操作的支持(文本操作的支持(Rich文本是既可以为文本是既可以
10、为文本,也可以为图形的一种特殊格式文本。)文本,也可以为图形的一种特殊格式文本。)3.CTreeView主要提供一些树型控件所实现的功能的支持。它使主要提供一些树型控件所实现的功能的支持。它使一种数据的显示方式可以更富于变化。一种数据的显示方式可以更富于变化。4.ListView该类与类该类与类CTreeViewCTreeView一样,更多的好处在于提供一样,更多的好处在于提供了一种简捷地实现数据的不同显示的途径了一种简捷地实现数据的不同显示的途径5.CScrollView它主要提供视图的滚动显示。需要注意的是,它主要提供视图的滚动显示。需要注意的是,该类的直接基类是该类的直接基类是CView
11、CView类类916.4 文档模板类文档模板类16.4.1 16.4.1 CDocTemplateCDocTemplate类类16.4.2 CDocTemplate类的基本函数说明类的基本函数说明CDocTemplateCDocTemplate类的基类类的基类为为CCmdTargetCCmdTarget。1016.4.3 文档模板文档模板CDocTemplate类的函数使用说明类的函数使用说明 在在VC中,文档类、与文档类相关联的视图类以及为视图类提供显中,文档类、与文档类相关联的视图类以及为视图类提供显示的框架窗口都是由文档模板创建的。每一种文档类型都有一种文档示的框架窗口都是由文档模板创建
12、的。每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档 CDocTemplateCDocTemplate(UINT(UINT nIDResource nIDResource,/,/和文档类型一同使用的各种资源的资源标识符和文档类型一同使用的各种资源的资源标识符 CRuntimeClassCRuntimeClass*pDocClass pDocClass,/指向派生文档类的指向派生文档类的CRuntimeClassCRuntimeClass对象的指针对象的指针 CRuntimeClassCRuntimeC
13、lass*pFrameClass pFrameClass,/,/指向指向派生框架类的派生框架类的CRuntimeClassCRuntimeClass对象的指针对象的指针 CRuntimeClassCRuntimeClass*pViewClass pViewClass);/);/指向指向CView派生视类的派生视类的CRuntimeClassCRuntimeClass对象的指针对象的指针文档、框架窗口和视图的创建过程之间的先后顺序为:文档、框架窗口和视图的创建过程之间的先后顺序为:创建文档创建文档 创建框架窗口创建框架窗口 创建视图创建视图文档、视图和框架三者之间是相互关联、相互协调的,文档、视
14、图和框架三者之间是相互关联、相互协调的,彼此都包含了彼此都包含了指向对方的指针指向对方的指针。它们之间的联系是通过文档模板的构造函数来实现。它们之间的联系是通过文档模板的构造函数来实现的。文档模板的构造函数的原型如下:的。文档模板的构造函数的原型如下:11 在应用程序的在应用程序的InitInstanceInitInstance()()方法中,通过使用方法中,通过使用文档模板的文档模板的构造函数构造函数创建文档模板的对象如下:创建文档模板的对象如下:BOOLBOOL CMymdiApp CMymdiApp:InitInstanceInitInstance()()CMultiDocTemplat
15、e CMultiDocTemplate*pDocTemplate2;*pDocTemplate2;pDocTemplate2=new pDocTemplate2=new CMultiDocTemplateCMultiDocTemplate (IDR_MYMDITYPE2,IDR_MYMDITYPE2,RUNTIME_CLASS(CMymdiDoc2),/MDI RUNTIME_CLASS(CMymdiDoc2),/MDI派生文档类的派生文档类的CRuntimeClassCRuntimeClass对象的指针对象的指针 RUNTIME_CLASS(RUNTIME_CLASS(CChildFrame
16、CChildFrame),/MDI),/MDI派生子框架类的派生子框架类的CRuntimeClassCRuntimeClass对象的指针对象的指针 RUNTIME_CLASS(CMymdiView2);/RUNTIME_CLASS(CMymdiView2);/创建文档模板的对象创建文档模板的对象/然后,使用然后,使用CwinAppCwinApp:AddDocTemplateAddDocTemplate()()方法将新模板添加到应用程序的文方法将新模板添加到应用程序的文档模板列表中档模板列表中 AddDocTemplateAddDocTemplate(pDocTemplate2);(pDocTe
17、mplate2);12文档模板字符串在资源文件中的定义描绘了文档模板的信息,它文档模板字符串在资源文件中的定义描绘了文档模板的信息,它由至多九个子串组成。其格式如下:由至多九个子串组成。其格式如下:nIDResourcenIDResource nn /在在SDISDI应用程序中的标题栏上的标题应用程序中的标题栏上的标题 nn /新文档的默认名新文档的默认名 nn /文档类型的名字文档类型的名字 nn /匹配此类型文档的文件过滤器匹配此类型文档的文件过滤器 nn /文档的文件扩展名文档的文件扩展名 nn /存储在寄存器中的文档类型的标识符存储在寄存器中的文档类型的标识符 nn /存储在寄存器中的
18、文档类型的标识符存储在寄存器中的文档类型的标识符 n /)n /允许从允许从FilterNameFilterName删除的文件扩展名删除的文件扩展名 )/允许允许MacintoshMacintosh的文件类型被指定在的文件类型被指定在FilterExtFilterExt中中1316.5 编写单文档应用程序编写单文档应用程序 创建一个应用程序,其界面的标题为创建一个应用程序,其界面的标题为“MySdiMySdi”。在应用程序的在应用程序的主窗口中显示一文本主窗口中显示一文本“您好您好,单文档界面的例程单文档界面的例程!”!”,并始终出现在,并始终出现在窗口的中央。窗口的中央。“编辑编辑”菜单上有
19、一个菜单项菜单上有一个菜单项“改变显示文本改变显示文本”,单击该项可,单击该项可以弹出一个对话框,通过这个对话框可以改变主窗口中的显示文本以弹出一个对话框,通过这个对话框可以改变主窗口中的显示文本1416.5.2输入应用程序的代码输入应用程序的代码1.创建工程创建工程2.添加资源添加资源 为程序添加如图所示的对话框。然后使用为程序添加如图所示的对话框。然后使用ClassWizardClassWizard为对话为对话框生成框生成CDialogCDialog类的派生类类的派生类CDlgInputCDlgInput,并为其中的并为其中的Edit BoxEdit Box控件控件(其其IDID为为IDC
20、_EDIT1)IDC_EDIT1)添加相关联的成员变量添加相关联的成员变量m_inputm_input,其类型为其类型为CStringCString153.为为CMysdiDoc类添加成员变量类添加成员变量手动地将成员变量添加到类手动地将成员变量添加到类CMysdiDoc的定义中。如下面的步骤所示:的定义中。如下面的步骤所示:在在Workspace窗口中的窗口中的FileView选项卡中展开选项卡中展开Mysdi files|Header Files双击双击MysdiDoc.h,VC+将在代码编辑窗口中打开文件将在代码编辑窗口中打开文件MysdiDoc.h,这个文这个文件包括了件包括了Mysd
21、i应用程序中的文档类应用程序中的文档类CMysdiDoc的定义。的定义。在在CMysdiDoc的定义中,找到下面的程序代码段的定义中,找到下面的程序代码段/Attributespublic:在此之后手工地输入在此之后手工地输入CString m_str;在类在类CMysdiDoc的定义中包括多个的定义中包括多个public块。事实上,可以把这些定义都放块。事实上,可以把这些定义都放到同一个到同一个public块中,在定义中包括多个块中,在定义中包括多个public块只是为了区别开不同用途块只是为了区别开不同用途的公有成员。的公有成员。164文档变量初始化文档变量初始化为了测试该程序,在为了测试
22、该程序,在CMysdiDoc的的OnNewDocument成员变量成员变量中为公有成员中为公有成员m_str赋以初值赋以初值“您好您好,单文档界面的例程单文档界面的例程!”。方法是使用下面的代码替换方法是使用下面的代码替换OnNewDocument的实现代码中的的实现代码中的BOOL CMymdiDoc2:OnNewDocument()if(!CDocument:OnNewDocument()return FALSE;m_str=您好您好,单文档界面的例程单文档界面的例程!;return TRUE;175视图的输出视图的输出 下面我们将为下面我们将为Mysdi程序的视图类程序的视图类CMysd
23、iView类的类的OnDraw成成员函数添加一些代码,以将文档类中的员函数添加一些代码,以将文档类中的m_str成员变量的内容显成员变量的内容显示到视图的框架窗口中。示到视图的框架窗口中。这里我们用下面的代码来替换类这里我们用下面的代码来替换类CMysdiView的的OnDraw成员函数成员函数void CMysdiView:OnDraw(CDC*pDC)CMysdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereCRect rectClient;GetClientRect(re
24、ctClient);/获取当前客户区的指针获取当前客户区的指针CSize sizeClient=rectClient.Size();/获取当前客户区的大小获取当前客户区的大小CString str=pDoc-m_str;/从文件中读取数据从文件中读取数据CSize sizeTextExtent=pDC-GetTextExtent(str);/用新选定的字体绘制字符用新选定的字体绘制字符串串pDC-TextOut(sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str);186文档串行化文档串行化 先在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C+面向对象与可视化程序设计_15 C+ 面向 对象 可视化 程序设计 _15
限制150内