MFC多文档的创建和打开过程

我们在学习MFC的时候,时常是很迷糊的,往往微软很多很好的机制都都深埋到代码里面了,让你无法看清她的神秘面纱。常常我们是糊里糊涂的将代码写出来了,往往是知其然,不知其所以然。这样的时候,有时候让我感觉很惶恐。叫我去看msdn,有发现自己的英文水平有限,再者,实在没这个耐心将其看完。看到一本很经典的书《深入浅出MFC这本书对MFC的机制讲的很好。仔细看了会对你受益匪浅,让你认识到,VC MFC编程就是拖拖控件这么简单的事情。

MFC最经典的就是她的文档视图结构了 ,本文就愿作抛砖引玉之石。有不对之处,请大家批评指正。我在说明这个过过程是前,我想说 我们的document 和view 以及Frame类,是一个三口组。他们是由CDocTempalate这个进行管理的,单文档模板类(CSigleDocTemplate)中成员变量是 CDocument * m_OnlyDoc,多文档模板类(CMutiDocTemplate)中成员函数是一个指针CPtrList
m_docList。有此我们可以看出单文档的单,是指他只能打开一个文档类。而多文档可以打开多种类型的文档,他们都是可以打开不同类型的文件,但是多文档能一次打开多种文档,单文档只能一次打开一个类型的文档。文档模板类有是有谁来管理的呢,他是有文档管理器类CDocManager管理的,CDocManager有一个链表CPtrList m_templateList ;CDocManager  由我们APP接受管理。CDocument
类中有一个链表 m_viewList,所以文档可以有多个view,但是view不能对应多个文档。在文档中能UpdataAllview来更新所有跟本文当关联的view。在view能getdocment 。这样三口组之间都能像互通有无了。

现在开始说她的创建过程,当我们点击新建的时候,我们APP类会接收到消息,然后调用CWinApp::OnFileNew()

这个函数会调用CDocManger::OnFileNew() 这个函数会调用CMutiDocTemplate  ::OpendocmentFile接着这个函数会调用CreateNewDocument 和CreateNewFrame 创建document和frame,view。我们要是想改原本的默认的doc,就要app类的InitInstance()函数中去改变你加入CMultiDocTemplate* pDocTemplate;重新构建。或者注释掉

cmdInfo.m_nShellCommand=cmdInfo.FileNothing;

在后面重新写一个函数来实现CreateNewDocument 和CreateNewFrame ,和InitialUpdateFrame(); 程序就会以我们加载我们重新构造的文档视图结构。

   对于文档的打开过程和文档的创建过程类似。当我们点击打开的时候,我们APP类会接收到消息,然后调用CWinApp::OnFileOpen()

这个函数会调用CDocManger::OnFileOpen() 这个函数会调用App::OpenDocumentFile(LPCTSTR lpszFileName)这个函数要自己手动重载,CMutiDocTemplate::OpenDocumentFile(LPCTSTR
lpszFileName)接着这个函数会调用CreateNewDocument 和CreateNewFrame 创建document和frame,view。这样就会加载我们的文档视图。我们要修改就是在App::OpenDocumentFile(LPCTSTR lpszFileName)里面修改的话,我们就要用自己定义的CMutiDocTemplate*指针来调用OpenDocumentFile(LPCTSTR
lpszFileName)。

至此我要说的多文档的创建和打开的流程就是这样。希望大家批评指正。

附图一张   截至深入浅出MFC

MFC多文档的创建和打开过程

时间: 2025-01-01 12:13:33

MFC多文档的创建和打开过程的相关文章

关于MFC视图文档框架的理解-1

一.单个文档和多个文档的区别: MFC分为对话框程序,单文档程序和多文档程序. 单个文档程序:一个主框架内仅允许打开一个视图,若要打开另一个,则当前的文档必须得关闭.单文档程序可以打开不同格式的文档. 对于单文档程序,主框架(CFrameWnd).视图(CView).文档(CDocument)被文档模板CSingleDocTemplate粘合在一起. 多个文档程序:一个主框架内可以打开多个视图. 对于多文档程序,主框架(CMDIFrameWnd)是单独存在的,子框架(CMDIChildWnd).

Android官方入门文档[1]创建一个Android项目

Android官方入门文档[1]创建一个Android项目 创建一个Android项目 这节课教你1.创建与Android Studio中的一个项目2.创建使用命令行工具项目 你也应该阅读?管理项目 Creating an Android Project This lesson teaches you to1.Create a Project with Android Studio2.Create a Project with Command Line Tools You should also

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

最近学习计算机图形学写的基于opengGL的作业 源码下载链接:链接:http://pan.baidu.com/s/1slANShZ 密码:hbwj 1.三维网格坐标建立 2.基本3维图形创建 3.鼠标相应旋转缩放 4.键盘相应旋转缩放 5.灯光设置 6.纹理载入映射 7.读取模型 关于MFC配置编写openGL网上有很多教程 需要的函数创建一般是: OnCreat() OnDestroy() Onsize() PreCreateWindow() OnDraw() 在我的MFC单文档项目中ena

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

[翻译] DTCoreText 从HTML文档中创建富文本

DTCoreText 从HTML文档中创建富文本 https://github.com/Cocoanetics/DTCoreText 注意哦亲,DTRichTextEditor 这个组件是收费的,不贵,才650美元而已^_^. DTCoreText This project aims to duplicate the methods present on Mac OSX which allow creation of NSAttributedString from HTML code on iO

WinXP系统打开Word文档会弹出“打开方式”界面怎么办

WinXP系统打开Word文档会弹出"打开方式"界面怎么办 Word是微软公司开发的一个文字处理器应用程序,我们在日常办公中经常会使用到它.不过,最近有些XP系统用户反馈,电脑已经安装过Office,不过在打开Word文档时,总会弹出打"打开方式"界面,并提示选择你想用来打开此文件的程序,这该如何解决呢? 原因分析: 如果XP系统xitongcheng.com/xp/中安装过Office软件,而现在出现打开方式的界面,很有可能是文件关联出错了,或是你安装过别的Off

Android官方入门文档[16]创建一个Fragment代码片段

Android官方入门文档[16]创建一个Fragment代码片段 Creating a Fragment创建一个Fragment代码片段 This lesson teaches you to1.Create a Fragment Class2.Add a Fragment to an Activity using XML You should also read?Fragments 这节课教你1.创建一个Fragment代码片段类2.使用XML来添加一个Fragment代码片段给一个活动 你也

MFC单文档的视图分割

最近做的工作里包括了MFC单文档的分割,过程很简单,但还是想记录下来. 如下进行了单文档分割为三个视图的操作: 1 利用类向导建立额外的两个view  基类是CView 2 在mainFirm.cpp中包含两个新加的view的头文件 3 在mainFirm.h中添加分割窗口的成员变量CSplitterWnd m_wndSplitter; 4 在mainFirm.cpp中重写oncreateclient BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT