最新单文档与多文档PPT课件.ppt

上传人:豆**** 文档编号:24243673 上传时间:2022-07-04 格式:PPT 页数:52 大小:872.50KB
返回 下载 相关 举报
最新单文档与多文档PPT课件.ppt_第1页
第1页 / 共52页
最新单文档与多文档PPT课件.ppt_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《最新单文档与多文档PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新单文档与多文档PPT课件.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、211.1 概述概述 911.1.4 SDI程序的消息传递过程程序的消息传递过程 当用户选择了菜单项,当用户选择了菜单项,单击了快捷键或工具条单击了快捷键或工具条按钮,系统就会发送按钮,系统就会发送WM_COMMAND消息。框消息。框架窗口实际上是大多数架窗口实际上是大多数WM_COMMAND消息的接消息的接受者,但受者,但WM_COMMAND消息还可以在视图、文消息还可以在视图、文档,甚至应用程序类中档,甚至应用程序类中被处理。被处理。1011.2 Doc/View框架的主要成员框架的主要成员 Doc/View框架虽然可以调用成百上千个不框架虽然可以调用成百上千个不同的类,但是核心类只有五个

2、同的类,但是核心类只有五个: :CWinAppCDocumentCViewCDocTemplateCFrameWnd 1111.2.1 CWinApp 类类 CWinApp类代表主程序,类代表主程序,CWinApp本身是不可见的,本身是不可见的,它负责维护进程的启动、终止、消息循环、命令行参数、它负责维护进程的启动、终止、消息循环、命令行参数、资源管理资源管理 成员成员描述描述m_pszAppNamem_pszAppName应用程序名应用程序名M_lpCmdLineM_lpCmdLine命令行参数命令行参数M_pMainWndM_pMainWnd应用程序主窗口指针应用程序主窗口指针M_pszE

3、xeNameM_pszExeName可执行文件名可执行文件名M_pszProfileNameM_pszProfileName配置配置INIINI文件名文件名M_pszRegistrKeyM_pszRegistrKey配置注册表主键值配置注册表主键值LoadCursorLoadCursor加载光标资源加载光标资源LoadIconLoadIcon加载图标资源加载图标资源部分部分主要主要成员成员1211.2.2 CDocument类类 CDocument 的一般方法 方法方法 说明说明 GetTitle(GetTitle() ) 获得文档标题获得文档标题 SetTitle(SetTitle() )

4、设置文档标题设置文档标题 GetPathName()GetPathName() 获得文档数据文件的路径字符串获得文档数据文件的路径字符串 SetPathName()SetPathName() 设置文档数据文件的路径字符串设置文档数据文件的路径字符串 GetDocTemplate()GetDocTemplate() 获得指向描述文档类型的文档模板的指针获得指向描述文档类型的文档模板的指针 AddView()AddView() 对与文档相关联的视图列表添加指定的视图对与文档相关联的视图列表添加指定的视图 RemoveView()RemoveView() 从文档视图列表中删除视图从文档视图列表中删除

5、视图 UpdateAllViews()UpdateAllViews() 通知所有视图,文档己被通知所有视图,文档己被修改,应重画修改,应重画 DisconnectViews()DisconnectViews() 使文档与视图相分离使文档与视图相分离 GetFile()GetFile() 获得指向获得指向 CFileCFile 类型的指针类型的指针 13CDocument 的的虚虚拟拟方方法法方方法法说说明明O On nN Ne ew wD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来建建立立文文档档O On nO Op pe en nD Do

6、oc cu um me en nt t( () )由由 M MF FC C 调调用用来来打打开开文文档档O On nS Sa av ve eD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来保保存存文文档档O On nC Cl lo os se eD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来关关闭闭文文档档C Ca an nC Cl lo os se eF Fr ra am me e( () )确确定定观观察察文文档档的的框框架架窗窗口口是是否否被被允允许许关关闭闭D De el le et

7、te eC Co on nt te en nt ts s( () )在在未未撤撤消消文文档档对对象象时时删删除除文文档档数数据据R Re el le ea as se eF Fi il le e( () )释释放放文文件件以以允允许许其其它它应应用用程程序序使使用用S Sa av ve eM Mo od di if fi ie ed d( () )查查询询文文档档的的修修改改状状态态并并存存储储修修改改的的文文档档I Is sM Mo od di if fi ie ed d( () )确确定定文文档档从从它它最最后后一一次次存存储储后后是是否否被被修修订订过过S Se et tM Mo od

8、di if fi ie ed dF Fl la ag g( () )设设置置文文档档从从它它最最后后一一次次存存储储后后是是否否被被修修订订过过的的布布尔尔值值G Ge et tF Fi ir rs st tV Vi ie ew wP Po os si it ti io on n( () )获获得得视视图图列列表表头头的的位位置置G Ge et tN Ne ex xt tV Vi ie ew w( () )获获得得视视图图列列表表的的下下一一个个视视图图最常用的是最常用的是SetModifiedFlag()和和UpdateAllViews()。文档内容被修改。文档内容被修改后,一般要调用后,一

9、般要调用SetModifiedFlag()来设定一个标志。来设定一个标志。UpdateAllView()刷新所有和文档关联的视图。实际上该函数调用各个视图类的刷新所有和文档关联的视图。实际上该函数调用各个视图类的OnUpdate()函数。这样做可以保证各个视图之间的同步。函数。这样做可以保证各个视图之间的同步。14 用户可通过函数用户可通过函数GetFirstViewPosition()和和GetNextView()得到和文得到和文档关联的视图的指针,代码如下:档关联的视图的指针,代码如下:POSITION pos = GetFirstViewPosition(); /得到视图列表头的位置得到

10、视图列表头的位置While(pos != NULL) CView *pView = GetNextView(pos);/获得视图列表中的视图指针获得视图列表中的视图指针CDocument类在现在流行的类在现在流行的MVC(Modal、View、Control)设计模)设计模式中相当于其中的式中相当于其中的Modal,表示抽象数据模型。,表示抽象数据模型。文档最主要的功能如下:文档最主要的功能如下:l 打开保存文档打开保存文档l 维护文档相关的视图列表维护文档相关的视图列表l 维护文档修改标志维护文档修改标志l 通过电子邮件发送文档通过电子邮件发送文档 用户修改文档数据时,调用用户修改文档数据时

11、,调用SetModifiedFlag方法来标志数据被更方法来标志数据被更改过。当程序关闭该文档关联的最后一个视图的时候,文档会自改过。当程序关闭该文档关联的最后一个视图的时候,文档会自动提示你保存修改。动提示你保存修改。 15从从CDocument类派生新的文档类的一般过程如下:类派生新的文档类的一般过程如下:为每一个文档类型从为每一个文档类型从CDocument类派生一个相应的文档类。类派生一个相应的文档类。为文档类添加成员变量,这些变量主要用来保存文档的数据,为文档类添加成员变量,这些变量主要用来保存文档的数据,并使其它的对象并使其它的对象(如视图对象如视图对象)可以访问这些成员变量,从而

12、实可以访问这些成员变量,从而实现文档和视图的相互搭配使用。现文档和视图的相互搭配使用。重载重载Serialize成员函数,实现文档数据的串行化。成员函数,实现文档数据的串行化。 无论是保存文档或是打开文档,应用程序都是通过无论是保存文档或是打开文档,应用程序都是通过调用文档类的调用文档类的Serialize串行化成员函数来完成操作的。串行化成员函数来完成操作的。因此,在大多数情况下,我们都需要重载因此,在大多数情况下,我们都需要重载Serialize成员成员函数。函数。Serialize成员函数带有一个成员函数带有一个CArchive类型的参数,类型的参数,这是一个与所打开的文件相关联的对象。

13、一般情况下,这是一个与所打开的文件相关联的对象。一般情况下,总是使用总是使用CArchive对象来保存和打开文档。对象来保存和打开文档。 16 CArchive对象是单向的,只用于保存或对象是单向的,只用于保存或读取两者之一,不能通过同一个读取两者之一,不能通过同一个CArchive对象既保存又读取文档。对象既保存又读取文档。 在框架创建在框架创建CArchive对象时,已根据用对象时,已根据用户选择的是户选择的是 “保存保存” ( “另存为另存为” )还是还是 “打开打开” 来设置了来设置了CArchive对象的类型,对象的类型,我们可以使用我们可以使用CArchive类的成员函数类的成员函

14、数IsStoring来检索当前来检索当前CArchive对象的类型,对象的类型,从而得知用户所期望的操作是保存还是从而得知用户所期望的操作是保存还是读取,执行不同的操作。读取,执行不同的操作。 1711.2.3 CView类类 视图类视图类(CView)是从是从CWnd类下派生的类下派生的 视图类具有视图类具有CWnd的所有功的所有功能如:创建、移动、显示和能如:创建、移动、显示和隐藏窗口等。隐藏窗口等。CView类可以类可以接收任何接收任何Windows消息,而消息,而CDocument类则不行类则不行 IsSelected():确定文档是否被选中确定文档是否被选中OnScroll():当用

15、户滚动时,当用户滚动时,CView的响应的响应OnInitialUpdate():在类第一次构造后由在类第一次构造后由MFC调用调用OnDraw():由由MFC调用发出文档到设备描述表调用发出文档到设备描述表OnUpdate():由由MFC调用对文档的修改进行响应调用对文档的修改进行响应OnPrepareDC():在调用在调用OnDraw()前允许修改设备描述表由前允许修改设备描述表由MFC调用调用CView主要主要虚拟方法虚拟方法 18 CView类中最常用的是类中最常用的是OnDraw函数,该函数函数,该函数在屏幕发生变化或因为焦点的变化需要重绘在屏幕发生变化或因为焦点的变化需要重绘时调用

16、,没有该函数,就不可能在程序的切时调用,没有该函数,就不可能在程序的切换后保证屏幕的正确显示。换后保证屏幕的正确显示。 注意注意: 尽量不要在尽量不要在OnDraw之外的函数调用绘之外的函数调用绘图方法,那些方法不会在视图需要重新绘制图方法,那些方法不会在视图需要重新绘制的时候被自动调用。的时候被自动调用。 若想在数据更新的时强制视图更新,可调用若想在数据更新的时强制视图更新,可调用Invalidate方法和方法和UpdateWindow方法来实现。方法来实现。 19CEditView:简单的文本编辑器,类似:简单的文本编辑器,类似NotepadCListView:基于列表的视图,类似文件夹浏

17、览:基于列表的视图,类似文件夹浏览CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构:基于树状控件的视图,类似文件浏览左侧的树状结构CRichEditView:支持多种字体、:支持多种字体、OLE和和RTF格式的高级编辑器格式的高级编辑器CScrollView:支持滚动条的视图:支持滚动条的视图CFormView:窗体视图,支持在上边使用对话框控件:窗体视图,支持在上边使用对话框控件CRecordView:连接到:连接到ODBC数据库的视图数据库的视图CDaoRecordView:连接到:连接到DAO数据库的视图数据库的视图CView的子类的子类2011.2.4 CDocTem

18、plate类类 文档模板类在应用程序中有着非常重要的文档模板类在应用程序中有着非常重要的作用,是它将原本独立的文档、视图和框作用,是它将原本独立的文档、视图和框架窗口对象联系在一起架窗口对象联系在一起 文档模板类负文档模板类负责具体的关联责具体的关联文档、视图、文档、视图、框架的创建框架的创建 21 在在VC+中,文档对象、与文档对象相关联的视图对象中,文档对象、与文档对象相关联的视图对象以及为视图对象提供显示的框架窗口都是由文档模板创以及为视图对象提供显示的框架窗口都是由文档模板创建的。建的。 每一种文档类型都有一种文档模板与之相对应,文档模每一种文档类型都有一种文档模板与之相对应,文档模板

19、负责创建和管理该文档类型的所有文档。板负责创建和管理该文档类型的所有文档。文档模板的构造函数的原型如下:文档模板的构造函数的原型如下:CDocTemplate(UINT nIDResource, /与文档一同使用的各种资源的资源标识符与文档一同使用的各种资源的资源标识符CRuntimeClass* pDocClass,/ 指向文档派生文档类的对象的指针指向文档派生文档类的对象的指针CRuntimeClass* pFrameClass, /框架类的派生框架类的对象指针框架类的派生框架类的对象指针CRuntimeClass* pViewClass /指向指向CView的派生视图类的对象指针的派生视

20、图类的对象指针 ) 在在SDISDI应用程序中只有一个文档模板对象,应用程序中只有一个文档模板对象,而而MDIMDI应用程序需要针对不同类型的文档定应用程序需要针对不同类型的文档定义不同的文档模板对象。义不同的文档模板对象。22当前位置当前位置被访问的位置被访问的位置访问方法访问方法文档文档视图视图GetFirstViewPositionGetNextView文档文档模板模板GetDocTemplate视图视图文档文档GetDocument视图视图框架框架GetParentFrame框架框架视图视图GetActiveView框架框架文档文档GetActiveDocumentMDI主框架主框架

21、MDI子框架子框架MDIGetActiveMDI子框架子框架 MDI主框架主框架GetParentFrame任何位置任何位置应用程序应用程序AfxGetApp任何位置任何位置主框架主框架AfxGetMainWndDoc/View结构的五个基本成员经结构的五个基本成员经常需要互相访问,假设某个视图常需要互相访问,假设某个视图想要获得文档,或某个框架需要想要获得文档,或某个框架需要获得活动视图,可以通过此表提获得活动视图,可以通过此表提供的方法进行解决供的方法进行解决 2311.2.5 CFrameWnd类类 CFrameWnd类在类在Doc/View结构中起着结构中起着举足轻重的作用。举足轻重的

22、作用。 框架窗口维护了很多幕后的工作,框架窗口维护了很多幕后的工作,例如工具条、菜单、状态条的显示、更例如工具条、菜单、状态条的显示、更新,视图的位置和显示,其它可停靠空新,视图的位置和显示,其它可停靠空间的停靠和动态尺寸调整。许多默认为间的停靠和动态尺寸调整。许多默认为MFC应用程序应该具备的基本功能都是应用程序应该具备的基本功能都是CframeWnd类在完成类在完成 2411.3文档操作中的一些重要概念文档操作中的一些重要概念 串行化处理串行化处理文档文档操作操作文档的消息映射文档的消息映射文档消息传递文档消息传递文件打开文件打开文件保存文件保存2511.3.1 串行化处理串行化处理 串行

23、化:串行化:将对象写入字节流和从字节流恢复对将对象写入字节流和从字节流恢复对象的操作象的操作 串行化除了可以使用文件保存对象之外,串行化除了可以使用文件保存对象之外,还可以通过网络、串口传输对象,还可以通过网络、串口传输对象,因此使因此使用字节流用字节流。串行化代码如下:。串行化代码如下:void CMDIDoc:Serialize(CArchive& ar) if (ar.IsStoring() / TODO: add storing code here else / TODO: add loading code here 26 使用串行化的好处是不需要重载文件打使用串行化的好处是不需要重载

24、文件打开、文件保存之类的方法,开、文件保存之类的方法,MFC框架会自动完框架会自动完成这些任务,并自动调用文档类的成这些任务,并自动调用文档类的Serialize方方法来完成串行化过程。法来完成串行化过程。 如果文档的抽象数据只有一个字符串,如果文档的抽象数据只有一个字符串,那么你只需要在那么你只需要在Serialize中添加相应语句就可中添加相应语句就可以完成串行化过程。以完成串行化过程。 如果不使用如果不使用MFC提供的串行化框架,那么提供的串行化框架,那么就需要重载一些函数,来获取文件名,然后就需要重载一些函数,来获取文件名,然后自己来读写文件完成对象的串行化。自己来读写文件完成对象的串

25、行化。27在进行串行化处在进行串行化处理时,通常是通理时,通常是通过过CArchive(档案档案)类来完成的类来完成的成员成员描述描述WriteString写入字符串写入字符串ReadString读取字符串读取字符串ReadClass读取类信息读取类信息WriteClass写入类信息写入类信息Close关闭档案关闭档案GetObjectSchema读取对象版本号读取对象版本号SetObjectSchema设置对象版本号设置对象版本号M_pDocument使用该档案的文档使用该档案的文档Read读取字节内容读取字节内容Write写入字节内容写入字节内容GetFile获取底层的获取底层的CFile

26、对象对象operator从流中读取基本类型从流中读取基本类型IsStoring是否处于保存状态是否处于保存状态Flush将缓冲中的数据强制写入流中将缓冲中的数据强制写入流中Abort在不发送异常的情况下关闭档案在不发送异常的情况下关闭档案ReadObject读取串行化对象读取串行化对象WriteObject写入串行化对象写入串行化对象CArchive类的类的常用成员常用成员 28若使用串行化,可以不关心若使用串行化,可以不关心文件打开关闭的具体过程,文件打开关闭的具体过程,只需要完善只需要完善Serialize方法即方法即可,但是很多应用程序都希可,但是很多应用程序都希望来亲自控制用户打开保存

27、望来亲自控制用户打开保存文件的过程文件的过程 缺省处理方法缺省处理方法CWinApp:OnFileOpenCWinApp:OpenDocumentFileCDocTemplate:OpenDocumentFileCDocument:OnOpenDocumentCDocument:SerializeCDocument:OnFileSave/OnFileSaveAsCDocument:OnSaveDocument文件打开或保存文件打开或保存时重载的某一个时重载的某一个缺省处理方法缺省处理方法2911.3.2 消息映射消息映射 使用使用ClassWizard来添加消息映射,但来添加消息映射,但有时,

28、有时,ClassWizard不支持某些类的消息不支持某些类的消息映射,需自己添加一些自定义的消息,映射,需自己添加一些自定义的消息,这时都需要手工添加消息映射代码这时都需要手工添加消息映射代码 数组中数组中存储的存储的信息信息消息应用于的控件消息应用于的控件ID,或者,或者ID范围范围所处理的消息所处理的消息消息所传递的参数消息所传递的参数消息所期望的返回值消息所期望的返回值 消息映射本质上就消息映射本质上就是一个数组,是一个数组,MFC使用该数组来确定使用该数组来确定消息传递时具体要消息传递时具体要传递给哪一个函数传递给哪一个函数30 当当MFC收到消息后,便自动确定目标窗口收到消息后,便自

29、动确定目标窗口和相应的和相应的MFC类的实例。然后它便搜索窗口的类的实例。然后它便搜索窗口的消息映射寻找匹配的项。若窗口中没有处理该消息映射寻找匹配的项。若窗口中没有处理该消息的处理程序,消息的处理程序,MFC便进一步搜索窗口的父便进一步搜索窗口的父类。如果父类也没有找到处理该消息的函数,类。如果父类也没有找到处理该消息的函数,MFC便将消息传递给该窗口的原窗口过程便将消息传递给该窗口的原窗口过程 31 在消息映射的时候,仅仅靠在消息映射的时候,仅仅靠ClassWizard生成的宏是不够生成的宏是不够的,有时需要向已有的消息映射添加自己的宏,但所添加的的,有时需要向已有的消息映射添加自己的宏,

30、但所添加的宏一定要放在宏一定要放在ClassWizard的特殊注释之外。的特殊注释之外。 以下是由以下是由AppWizard产生的默认产生的默认MDI视图的消息映射,另外添视图的消息映射,另外添加了一个菜单项的处理和一个加了一个菜单项的处理和一个WM_ERASEBKGND消息的映射:消息的映射: BEGIN_MESSAGE_MAP(CMDIView, CView) /AFX_MSG_MAP(CMDIView) ON_COMMAND(ID_OPER_TEST, OnOperTest) ON_UPDATE_COMMAND_UI(ID_OPER_TEST, OnUpdateOperTest) ON_

31、WM_ERASEBKGND() /AFX_MSG_MAP / Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP() 位于位于AFX_MSG_MAP之间的宏来自之间的宏来自ClassWizard特定宏特定宏 ON_COMMAND是通用宏是通用宏32在第二

32、个在第二个AFX_MSG_MAP之后,可以添加自己的之后,可以添加自己的消息映射,消息映射,ClassWizard不检查这里,这里的消不检查这里,这里的消息映射不会出现在息映射不会出现在ClassWizard中的中的 3311.3.3 消息传递消息传递 由于用户可以在很多由于用户可以在很多MFC类中映射同一个类中映射同一个消息,如可以在文档和视图中同时映射消息,如可以在文档和视图中同时映射打开文件的消息,这样就需要消息有明打开文件的消息,这样就需要消息有明确的来源,也有明确的接收者,因此需确的来源,也有明确的接收者,因此需要判断消息传递的顺序。要判断消息传递的顺序。 当前视图当前视图当前文档当

33、前文档与当前视图与当前视图/ /文档关文档关联的文档模板联的文档模板子框架窗口(只有子框架窗口(只有MDIMDI有该有该步骤)步骤)主框架窗口主框架窗口应用程序对象应用程序对象3411.4 SDI编程实例编程实例 【例【例11-1】在主窗】在主窗口中央显示一文口中央显示一文本本“您好您好, 单文档单文档界面的例程界面的例程!”。单。单击击“改变显示文改变显示文本本”菜单项,可菜单项,可弹出一个对话框,弹出一个对话框,通过此对话框可通过此对话框可改变主窗口中的改变主窗口中的显示文本内容显示文本内容 35(1) 创建工程文件和对话框资源创建工程文件和对话框资源 创建一个单创建一个单文档工程文件文档

34、工程文件MySdi,然后添,然后添加对话框资源加对话框资源(2) 为为CMySdiDoc类添加成员变量类添加成员变量 在在CMySdiDoc类的定义中增加如下的代码:类的定义中增加如下的代码: CString m_str;用以存放用以存放字符串字符串36(3) 文档变量初始化文档变量初始化打开打开CMySdiDoc.cpp文件,在文件,在 OnNewDocument成员函数加入以下代码:成员函数加入以下代码:BOOL CMySdiDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;m_str=“您好,单文档界面的例程!您好

35、,单文档界面的例程!”/初始化成员变初始化成员变量量return TRUE;37(4) 视图的输出视图的输出 MySdi程序视图类程序视图类CMySdiView类的类的OnDraw成员函数:成员函数:void CMySdiView:OnDraw(CDC* pDC) CMySdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rectClient; GetClientRect(rectClient); / 获取当前客户区的指针获取当前客户区的指针 CSize sizeClient=rectClient.Size();/ 获取当前客户区的大

36、小获取当前客户区的大小 CString str=pDoc-m_str;/ 从文件中读取数据从文件中读取数据 CSize sizeTextExtent=pDC-GetTextExtent(str);/ 用新选定的字体绘制字符串用新选定的字体绘制字符串 pDC-TextOut(sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str);调用调用GetDocument()得到文档类的指针,得到文档类的指针,将文档对象成将文档对象成员变量复制到字符串员变量复制到字符串str中中,调用,调用TextOut()将将

37、m_str的内的内容显示到框架窗口中的视图中。容显示到框架窗口中的视图中。38(5) 文档串行化文档串行化 在在 “编辑编辑” 菜单中添加菜单项菜单中添加菜单项“改变显示文改变显示文本本” (ID_EDIT_CHANGETEXT )。单击此。单击此菜单项可以将将对视图中显示文本所做的修改菜单项可以将将对视图中显示文本所做的修改保存到一个磁盘文件中,具体的实现方法如下:保存到一个磁盘文件中,具体的实现方法如下:void CMySdiDoc:OnEditChangetext() CDlgInput inputDlg;/创建一个创建一个 CInputDlg类的对象类的对象inputDlg if(in

38、putDlg.DoModal()=IDOK)/显示对话框显示对话框 m_str=inputDlg.m_input;/获取输入的字符串获取输入的字符串UpdateAllViews(NULL);/更新视图更新视图 39为了在为了在CMySdiDoc类中定义对话框类类中定义对话框类CDlgInput对象,对象,还必须在还必须在MySdiDoc.cpp文件中加入文件中加入CDlgInput类的头类的头文件文件DlgInput.h,代码如下:,代码如下: #include DlgInput.h/加入头文件加入头文件 为了把这些修改保存到磁盘文件中,并在需要时为了把这些修改保存到磁盘文件中,并在需要时可以

39、打开所保存的磁盘文件读取文档,需要重载可以打开所保存的磁盘文件读取文档,需要重载CExampleDoc类的类的Serialize函数来完成串行化。重载函数来完成串行化。重载后的后的Serialize函数的代码如下:函数的代码如下:void CMySdiDoc:Serialize(CArchive& ar)if (ar.IsStoring()arm_str;/读取文档内容读取文档内容 4011.5 MDI编程实例编程实例 【例【例16-216-2】创建多文档的应用程序,可以打开两种类】创建多文档的应用程序,可以打开两种类型的文档。型的文档。MyMdi1MyMdi1是系统默认生成的文档是系统默认生

40、成的文档( (可以打印可以打印) )。MyMdi21MyMdi21是另一个用户添加的文档类型是另一个用户添加的文档类型( (不允许打印不允许打印) ),在程序的窗口中显示在程序的窗口中显示“您好您好, , 多文档界面的例程多文档界面的例程!”!”, 注意如果活动文档的注意如果活动文档的 类型改变,则菜单的类型改变,则菜单的 “ “编辑编辑”项的子菜单项的子菜单不不 同,工具条上的同,工具条上的“打打印印” 按钮的激活状态也不按钮的激活状态也不 同同41(1) 创建创建MDI工程文件工程文件 创建创建MyMdi工程文件,工程文件,在在Step 4 of 6 的窗口中,的窗口中,单击单击Advan

41、ced按钮,在按钮,在File extention对话框中加对话框中加入入mmd,完成后的应用,完成后的应用程序的文件将使用程序的文件将使用“.mmd”为扩展名,文为扩展名,文件过滤器域显示为件过滤器域显示为“MyMdi文件文件(*.mmb)”,在在Step 6 of 6 的对话框中,的对话框中,为为CMyMdiView类设置基类设置基类为类为CEditView。42(2)创建第二种文档和视图类创建第二种文档和视图类View ClassWizard Class Info Add Class New 43(3) 创建资源创建资源 在在Resource.h文件中,手工加入下列代码文件中,手工加入下

42、列代码:#define IDR_MYMDITYPE2 135 这样就定义了第二类文档的文档、视图和框架窗这样就定义了第二类文档的文档、视图和框架窗口共同的资源口共同的资源ID,以后定义的菜单、文档模板等资,以后定义的菜单、文档模板等资源均可以使用此源均可以使用此ID文档模板字符串的格式如下:文档模板字符串的格式如下:nIDResource nnnnnnn44对于第一个文档,应用程序向导直接产生了一对于第一个文档,应用程序向导直接产生了一个文档模板,现在必须手工加入第二个资源模个文档模板,现在必须手工加入第二个资源模板字符串。具体的方法是:打开板字符串。具体的方法是:打开MyMdi.rc文件,文

43、件,首先找到如下代码:首先找到如下代码:IDR_MYMDITYPE nMyMdi nMyMdi nMyMdi 文件文件 (*.mmd) n.mmd nMyMdi.Document nMyMdi Document45在上面代码的后面加入在上面代码的后面加入:IDR_MYMDITYPE2 nMyMdi2 nMyMdi2 nMyMdi2 文件文件 (*.mm2) n.mm2 nMyMdi2.Document nMyMdi2 Document类似第一个类似第一个资源模板的资源模板的格式格式(3) 菜单、对话框资源菜单、对话框资源 类似第一个例题类似第一个例题46(4) 代码编辑代码编辑(a) 创建文档

44、模板类创建文档模板类 本程序支持多种文档,在应用程序的本程序支持多种文档,在应用程序的InitInstance()函数中,需函数中,需要定义新的文档模板的对象,在要定义新的文档模板的对象,在MyMdi.cpp中输入代码如下:中输入代码如下:BOOL CMyMdiApp:InitInstance() CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMyMdiDoc2), / MDI派生文档类的派生文档类的CRuntimeClass对象的指针对

45、象的指针RUNTIME_CLASS(CChildFrame), / MDI派生子框架类的派生子框架类的CRuntimeClass对象的指针对象的指针RUNTIME_CLASS(CMyMdiView2);/ 创建文档模板对象创建文档模板对象AddDocTemplate(pDocTemplate2);/将新模板添加到应用程序的文档模板列表中将新模板添加到应用程序的文档模板列表中47为使为使CMyMdiDoc2类和类和CMyMdiView2类在类在CMyMdiApp类中成为可识别的类,必须在类中成为可识别的类,必须在MyMdiApp.cpp文件中加入文件中加入CMyMdiDoc2类和类和CMyMdi

46、View2类的说明头文件类的说明头文件MyMdiDoc2.h和和MyMdiView2.h/ MyMdiApp.cpp : implementation of the CMyMdiApp class#include MyMdiDoc2.h/加入头文件加入头文件#include MyMdiView2.h48(b) 扩展扩展CMyMdiDoc2类类 添加成员变量:添加成员变量:在类在类CMyMdiDoc2中增加中增加Cstring类型的成员变量类型的成员变量m_str文档变量初始化:文档变量初始化:为了能够在的二个文档中显示为了能够在的二个文档中显示“您好您好, 多文档界面的例多文档界面的例程程!”

47、,需在,需在CMyMdiDoc2类的类的OnNewDocument()成员成员函数中为变量函数中为变量m_str赋初值。因此需添加下列代码:赋初值。因此需添加下列代码: BOOL CMyMdiDoc2:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;m_str=您好您好, 多文档界面的例程多文档界面的例程!;return TRUE;49添加菜单处理函数:添加菜单处理函数: 在类在类CMyMdiDoc2中为中为“编辑编辑”菜单中的菜单项菜单中的菜单项 “改变显示改变显示文本文本” 添加消息处理函数添加消息处理函数OnEditCh

48、angeText(),加入代码如下:,加入代码如下:void CMyMdiDoc2:OnEditChangetext() / TODO: Add your command handler code here CDlgInput inputDlg;/创建一个创建一个CinputDlg类的对象类的对象inputDlg if( inputDlg.DoModal()=IDOK )/显示显示inputDlg模式对话框模式对话框 m_str = inputDlg.m_input;/获取输入的字符串获取输入的字符串UpdateAllViews(NULL);/更新视图更新视图 为使为使CInputDlg类在类

49、在CMyMdiDoc类中成为可识别的类,必须在类中成为可识别的类,必须在MyMdiDoc2.cpp文件中加入文件中加入CinputDlg类的说明头文件类的说明头文件InputDlg.h/ MyMdiDoc2.cpp : implementation of the CMyMdiDoc2 class#include DlgInput.h#include DlgInput.h/加入头文件加入头文件 50文档串行化文档串行化 :为了把对视图中显示文本的修改保存到磁盘文件中,为了把对视图中显示文本的修改保存到磁盘文件中,并在需要时可以打开所保存的磁盘文件读取文档,必并在需要时可以打开所保存的磁盘文件读取

50、文档,必须重载须重载CExampleDoc类的类的Serialize函数来完成串行化函数来完成串行化重载后的重载后的Serialize()函数的代码如下:函数的代码如下:/ CMyMdiDoc2 serializationvoid CMyMdiDoc2:Serialize(CArchive& ar)if (ar.IsStoring() arm_str;/读取文档内容读取文档内容 51(c) 视图的输出视图的输出 为将为将m_str的内容显示到视图的框架窗口中。需要在的内容显示到视图的框架窗口中。需要在OnDraw()函函数中加入下列代码,注意下列代码的头两行与系统自动生成的代数中加入下列代码,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁