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

上传人:s9****2 文档编号:569959179 上传时间:2024-08-01 格式:PPT 页数:52 大小:872.50KB
返回 下载 相关 举报
最新单文档与多文档PPT课件_第1页
第1页 / 共52页
最新单文档与多文档PPT课件_第2页
第2页 / 共52页
最新单文档与多文档PPT课件_第3页
第3页 / 共52页
最新单文档与多文档PPT课件_第4页
第4页 / 共52页
最新单文档与多文档PPT课件_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《最新单文档与多文档PPT课件》由会员分享,可在线阅读,更多相关《最新单文档与多文档PPT课件(52页珍藏版)》请在金锄头文库上搜索。

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

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

3、szExeNameM_pszExeName可执行文件名可执行文件名M_pszProfileNameM_pszProfileName配置配置INIINI文件名文件名M_pszRegistrKeyM_pszRegistrKey配置注册表主键值配置注册表主键值LoadCursorLoadCursor加载光标资源加载光标资源LoadIconLoadIcon加载图标资源加载图标资源部分部分主要主要成员成员1111.2.2 CDocument类类 12最常用的是最常用的是SetModifiedFlag()和和UpdateAllViews()。文档内容被修改。文档内容被修改后,一般要调用后,一般要调用Set

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

22、文件的过程 缺省处理方法缺省处理方法CWinApp:OnFileOpenCWinApp:OpenDocumentFileCDocTemplate:OpenDocumentFileCDocument:OnOpenDocumentCDocument:SerializeCDocument:OnFileSave/OnFileSaveAsCDocument:OnSaveDocument文件打开或保存文件打开或保存时重载的某一个时重载的某一个缺省处理方法缺省处理方法2811.3.2消息映射消息映射 使用使用ClassWizard来添加消息映射,但有来添加消息映射,但有时,时,ClassWizard不支持某

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

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

25、assWizard的特殊注释之外。的特殊注释之外。 以下是由以下是由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_WM_ERASEBKGND() /AF

26、X_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是通用宏是通用宏31在第二个在第二个AFX_MSG_MAP之后,可

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

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

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

30、return TRUE;36(4) 视图的输出视图的输出 MySdi程序视图类程序视图类CMySdiView类的类的OnDraw成员函数:成员函数:void CMySdiView:OnDraw(CDC* pDC) CMySdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc); CRect rectClient; GetClientRect(rectClient); / 获取当前客户区的指针获取当前客户区的指针 CSize sizeClient=rectClient.Size();/ 获取当前客户区的大小获取当前客户区的大小 CString str=pDoc-m

31、_str;/ 从文件中读取数据从文件中读取数据 CSize sizeTextExtent=pDC-GetTextExtent(str);/ 用新选定的字体绘制字符串用新选定的字体绘制字符串 pDC-TextOut(sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str);调用调用GetDocument()得到文档类的指针,得到文档类的指针,将文档对象成将文档对象成员变量复制到字符串员变量复制到字符串str中中,调用,调用TextOut()将将m_str的内的内容显示到框架窗口中的视图中。容显示到框架窗

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

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

34、重载CExampleDoc类的类的Serialize函数来完成串行化。重载函数来完成串行化。重载后的后的Serialize函数的代码如下:函数的代码如下:voidCMySdiDoc:Serialize(CArchive&ar)if(ar.IsStoring()arm_str;/读取文档内容读取文档内容3911.5MDI编程实例编程实例【例【例16-216-2】创建多文档的应用程序,可以打开两种类】创建多文档的应用程序,可以打开两种类型的文档。型的文档。MyMdi1MyMdi1是系统默认生成的文档是系统默认生成的文档( (可以打印可以打印) )。MyMdi21MyMdi21是另一个用户添加的文档

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

36、用,完成后的应用程序的文件将使用程序的文件将使用“.mmd”为扩展名,文件为扩展名,文件过滤器域显示为过滤器域显示为“MyMdi文件文件(*.mmb)”,在,在Step 6 of 6 的对话框中,为的对话框中,为CMyMdiView类设置基类类设置基类为为CEditView。41(2)创建第二种文档和视图类创建第二种文档和视图类View ClassWizard Class Info Add Class New42(3)创建资源创建资源在在Resource.h文件中,手工加入下列代码文件中,手工加入下列代码:#define IDR_MYMDITYPE2 135这样就定义了第二类文档的文档、视图和

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

38、i文件文件(*.mmd)n.mmdnMyMdi.DocumentnMyMdiDocument44在上面代码的后面加入在上面代码的后面加入:IDR_MYMDITYPE2 nMyMdi2 nMyMdi2 nMyMdi2 文件文件 (*.mm2) n.mm2 nMyMdi2.Document nMyMdi2 Document类似第一个类似第一个资源模板的资源模板的格式格式(3)菜单、对话框资源菜单、对话框资源类似第一个例题类似第一个例题45(4)代码编辑代码编辑(a)创建文档模板类创建文档模板类本程序支持多种文档,在应用程序的本程序支持多种文档,在应用程序的InitInstance()函数中,需函数

39、中,需要定义新的文档模板的对象,在要定义新的文档模板的对象,在MyMdi.cpp中输入代码如下:中输入代码如下:BOOLCMyMdiApp:InitInstance() CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMyMdiDoc2), / MDI派生文档类的派生文档类的CRuntimeClass对象的指针对象的指针RUNTIME_CLASS(CChildFrame), / MDI派生子框架类的派生子框架类的CRuntimeClass对

40、象的指针对象的指针RUNTIME_CLASS(CMyMdiView2);/ 创建文档模板对象创建文档模板对象AddDocTemplate(pDocTemplate2);/将新模板添加到应用程序的文档模板列表中将新模板添加到应用程序的文档模板列表中46为使为使CMyMdiDoc2类和类和CMyMdiView2类在类在CMyMdiApp类中成为可识别的类,必须在类中成为可识别的类,必须在MyMdiApp.cpp文件中加入文件中加入CMyMdiDoc2类和类和CMyMdiView2类的说明头文件类的说明头文件MyMdiDoc2.h和和MyMdiView2.h/MyMdiApp.cpp:impleme

41、ntationoftheCMyMdiAppclass#include MyMdiDoc2.h/加入头文件加入头文件#include MyMdiView2.h47(b)扩展扩展CMyMdiDoc2类类添加成员变量:添加成员变量:在类在类CMyMdiDoc2中增加中增加Cstring类型的成员变量类型的成员变量m_str文档变量初始化:文档变量初始化:为了能够在的二个文档中显示为了能够在的二个文档中显示“您好您好,多文档界面的例多文档界面的例程程!”,需在,需在CMyMdiDoc2类的类的OnNewDocument()成员成员函数中为变量函数中为变量m_str赋初值。因此需添加下列代码:赋初值。因

42、此需添加下列代码:BOOLCMyMdiDoc2:OnNewDocument()if(!CDocument:OnNewDocument()returnFALSE;m_str=您好您好, 多文档界面的例程多文档界面的例程!;returnTRUE;48添加菜单处理函数:添加菜单处理函数:在类在类CMyMdiDoc2中为中为“编辑编辑”菜单中的菜单项菜单中的菜单项“改变显示文改变显示文本本”添加消息处理函数添加消息处理函数OnEditChangeText(),加入代码如下:,加入代码如下:voidCMyMdiDoc2:OnEditChangetext()/TODO:Addyourcommandhand

43、lercodehere CDlgInput inputDlg;/创建一个创建一个CinputDlg类的对象类的对象inputDlg if( inputDlg.DoModal()=IDOK )/显示显示inputDlg模式对话框模式对话框 m_str = inputDlg.m_input;/获取输入的字符串获取输入的字符串UpdateAllViews(NULL);/更新视图更新视图 为使为使CInputDlg类在类在CMyMdiDoc类中成为可识别的类,必须在类中成为可识别的类,必须在MyMdiDoc2.cpp文件中加入文件中加入CinputDlg类的说明头文件类的说明头文件InputDlg.h

44、/MyMdiDoc2.cpp:implementationoftheCMyMdiDoc2class#include DlgInput.h#include DlgInput.h/加入头文件加入头文件49文档串行化文档串行化:为了把对视图中显示文本的修改保存到磁盘文件中,为了把对视图中显示文本的修改保存到磁盘文件中,并在需要时可以打开所保存的磁盘文件读取文档,必并在需要时可以打开所保存的磁盘文件读取文档,必须重载须重载CExampleDoc类的类的Serialize函数来完成串行化函数来完成串行化重载后的重载后的Serialize()函数的代码如下:函数的代码如下:/CMyMdiDoc2seria

45、lizationvoidCMyMdiDoc2:Serialize(CArchive&ar)if(ar.IsStoring() arm_str;/读取文档内容读取文档内容 50(c)视图的输出视图的输出 为将为将m_str的内容显示到视图的框架窗口中。需要在的内容显示到视图的框架窗口中。需要在OnDraw()函函数中加入下列代码,注意下列代码的头两行与系统自动生成的代数中加入下列代码,注意下列代码的头两行与系统自动生成的代码的差异,需要按下列方式进行调整。码的差异,需要按下列方式进行调整。voidCMyMdiView2:OnDraw(CDC*pDC)CMyMdiDoc2* pDoc = (CMy

46、MdiDoc2*)GetDocument();/得到文档对象指针得到文档对象指针ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCRect rectClient;/ 获取当前客户区的大小获取当前客户区的大小GetClientRect(rectClient); / 获取当前客户区的指针获取当前客户区的指针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); /输出文本输出文本在文件开始部分加入在文件开始部分加入:#include MyMdiDoc2.h51

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号