MFC浅析(2) 文档视图结构中文档操作流程

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

文档视图结构中文档操作流程

FMD(http://www.fmdstudio.net)

一基本架构

一个程序可以看作是建立在对文档进行处理的基础上的, 而程序可处理的文档类型有可能有多种,同时每种文档 又可能同时被打开多个。每个文档又可分为数据部分和 表现部分。

基于这种认识,MFC文档视图框架结构将各 功能模块总结为对象,用相互关联的这些对象类来建立 应用程序.

①文档类型管理

CWinApp代表程序,它可处理多种类型的文档,这样,就 必须有一个存储管理文档类型的内部成员,这个成员就是

CDocManager * m_pDocManager

CDocManager负责管理文档类型

CDocManager内部用

CPtrList m_templateList;(指针链表)

记录文档类型

②文档类型实现

CDocTemplate(文档模板)代表具体的文档类型

一个程序所能处理的文档类型,对对应各自的文档模板

这些模板对象的指针被记录在m_templateList,并且由m_pDocManager管理

③文档模板的实现

对于某一种文档,其内部数据结构,及外部表现形式,及针对它的操作命令都相对固定,因此 文档模板有三个构成部分,文档的数据,用CDoucument管理;文档的表现形式,CView表示;文档 在窗口系统中的容器,及菜单,工具条等命令形式则由CFrameWnd管理。必要时,同一文档可能需 要多种表达,即一个CDocument可能关联几个CView,但模板声明时,只考虑一个文档对应一个视图。

这些信息被记录在其三个成员中

CRuntimeClass* m_pDocClass; // class for creating new documents

CRuntimeClass* m_pFrameClass; // class for creating new frames

CRuntimeClass* m_pViewClass; // class for creating new views

一各文档模板,对应一种文件类型,而这一类型的文件则可以有很多,这些对应的文件将记录在

CPtrList m_docList;

另外,文档模板也包含了该文档类型所对应的资源,如菜单,标题,图标等等信息

二 文档类型的建立

程序执行之初,(InitInstance 中)将建立文档类型链表

依次建立多个文档类型(CCMultiDocTemplate),再一一添加(AddDocTemplate)到CWinApp的文档类型列表m_templateList中 这样就建立了一个文件类型表,文件的新建,打开都将首先查找这个文件类型链表,找出文档的类型,得到文档模板, 由文档模板得到文档应有的数据结构、文档的图形表述,及操作等等。

三 文档的新建

①界面 命令ID_FILE_NEW发出

CWinApp::OnFileNew()处理

交由CDocManager * m_pDocManager(文档类型管理)处理

②CDocuManager查看文件类型列表,如过程序支持多种类型文档,给出一个类型选择机会。

若文档类型列表中只有一种文档类型,直接选用这种类型。

③找到文档模板后,将调用文档模板的OpenDocumentFile(..)成员,传入的参数为NULL,表示新建

i . OpenDocumentFile首先将首先建立文档的数据部分:

CDocument* pDocument = CreateNewDocument();

这将按照m_pDocClass所记录的CDocument类建立其实际数据对象。

数据对象建立后,将其添加到CPtrList m_docList中,记录下这一文档模板对应打开的所有实际文件。 同时,CDocument也有一个列表CPtrList m_viewList; 用于记录文档对象所对应的(CView)视图,视图 容许有多个(同样的数据,可能有需要不同的表达形式)。

ii. 为数据建立其表现形式的容器,即框架窗口

CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);

根据文档模板记录的框架类m_pFrameClass建立框架对象。

iii. 建立框架对象的同时,CView(数据的表现形式,数据图像)的类型m_pViewClass将作为参数传给框架对象

CCreateContext context;

context.m_pNewViewClass = m_pViewClass;

然后框架对象建立其实际的窗口

 if (!pFrame->LoadFrame(m_nIDResource,
   WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
   NULL, &context))

LoadFrame 中将调用Create生成窗口,

框架窗口建立客户区时,将调用CreateView(pContext, AFX_IDW_PANE_FIRST)建立模板所制定的CView对象

并建立窗体pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0), this, nID, pContext))

在CView建立时,其OnCreate()中将自己添加到对应文档的视图列表中:

pContext->m_pCurrentDoc->AddView(this);

④文档对象(一般将文档(文件)的数据部分成为文档对象,与前面提到的文档意义有区别),文档对象的表现部分(视图对象) 及视图对象在Windows系统中的窗口容器(框架对象)自此都建立好了,接下来,是各对象的初始化。

i. pDocument->OnNewDocument()

在OnNewDocument()中有用户实现相应数据的新建或初始。

完成后,将m_nUntitledCount增1,这个数用来对新文档进行计数,好用来给新文件起缺省名(例如:未命名3.txt);

(如果OpenDocumentFile(.)有参数(打开文件时),在这儿将调用的是pDocument->OnOpenDocument() 用文件中的数据初始数据对象,)

ii. InitialUpdateFrame初始化框架

InitialUpdateFrame中将激活一个CView对象(若无,则为其他子窗口)

并且向所有子窗口发送SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);

WM_INITIALUPDATE是MFC自定义的消息,用于在此时实现相关初始化,

在CView::OnInitialUpdate中可写入需要添加的初始操作。

激活框架窗口或相应视图。

其后,更新框架窗口标题

⑤自此,新建文档过程结束。

四 文档的打开

①响应打开命令 ID_FILE_OPEN

CWinApp::OnFileOpen()

调用m_pDocManager->OnFileOpen();

②DoPromptFileName提供打开文件对话框,得到文件名

③调用AfxGetApp()->OpenDocumentFile(newName);

(这与新建文件有所不同)

这是应用程序类的一个虚函数,可以添加特定处理于此

一般情况下,将接着调用CWinApp::OpenDocumentFile(newName);

④回到CDocManager

m_pDocManager->OpenDocumentFile(lpszFileName);

查找文档模板列表,找出文档应该采用的文档模板。

调用各模板的MatchDocType 判断是否合适,或是否已经打开过了。

pTemplate->MatchDocType(szPath, pOpenDocument)

若文件已经被某模板打开过,激活相应框架,试图。

若没打开,单有相符合模板,使用该文档模板打开文件

pBestTemplate->OpenDocumentFile(szPath);

若不是程序处理的文件类型,报错返回。

⑤用找到的最合适文档模板打开文件。

CMultiDocTemplate::OpenDocumentFile

⑥ ....

以下各步骤与新建文件③以后各步相同,只是传入参数不同

建立文档对象后,初始化时,将调用CDocumet::OpenDocumentFile

而不是CDocumet::OnNewDocument();

MFC文档视图结构学习笔记 文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关数据处理的方法 分为数据的管理和显示,文档用于管理和维护数据,视图用来显示和编辑数据 什么是文档 文档的概念在MFC应用程序中的适用范围很广,一般说来,文档是能够被逻辑地组合的一系列数据,包括 阅读详情

相关推荐

MFC浅析(3) 文档视图结构中命令的处理流程

文档视图结构中命令的处理流程<!-- body {color:black;font-family: "宋体"; font-size: 9pt} p {color:black;font-family: "宋体"; font-size: 9pt} pre {color:black;font-family: "宋体"; font-size: 9pt} td

FMD STUDIO 2325

MFC多文档流程及函数理解

1.首先创建theApp CMyMulDocProApp theApp; 2.调用APP实现类中的InitInstance函数进行实例化 BOOL CMyMulDocProApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 INITCOMMONCONTROLSEX I.

qq_41985652的博客 2283

[MFC]文档视图体系结构、单文档界面

1. 文档视图结构:     1)MFC的一种模块化设计思想的产物,要求程序的数据和表现数据的视图分开来处理;     2) 数据以文档的形式表现,文档可以存储在磁盘中永久保存也可以被程序读出并进行处理;     3)文档(SDI,Single Document Interface)和多文档(Multiple Document Interface)的区别:单文档界面程序只支持打开一个

Lirx_Tech的专栏 3456

MFC文档多文档框架

MFC曾在Windows桌面开发领域大放异彩,但随着时间的推移,如今相比各种流行的GUI开发技术(QT、WPF、Flutter、Web技术等),MFC被贴上“古老”、“落后”的标签。 但有大量工业软件采用MFC进行开发,且在AutoCAD二次开发领域,MFC是官方指定的ObjectARX界面开发方式,掌握MFC技术具有一定的现实需求。 本文从整体上介绍MFC文档多文档应用程序的整体框架

helolizi710的博客 1101

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

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

wuan584974722的专栏 2万+

VC++ MFC文档多文档的步骤方法

框架ChildFrm的增加与修改: 1、首先在在Headers files和source files中分别添加文件,设其名字为ChileFrm.h及ChildFrm.cpp,并将自己在外部新建的多文档工程中的ChildFrm的.h及.cpp文件中的代码复制过去,注意:将.cpp中的app文件头文件改为自己的工程名.h; 主框架MainFrm的修改: 2、在主框架MainFrm的.h中的DE

机器视觉 4097

MFC文档视图教学实践指南

MFC(Microsoft Foundation Classes)是微软公司开发的一套C++类库,用于帮助开发者创建Windows应用程序。自1992年首次发布以来,MFC一直是许多Windows桌面应用程序开发的首选框架MFC封装了Windows API,提供了一个面向对象的编程环境,使开发者能够以更直观和便捷的方式构建应用程序。Windows消息体系是Windows操作系统的核心机制之一,它负责管理和调度应用程序与系统之间的所有交互。

weixin_42181686的博客 679

MFC文档/视图结构应用程序

文档/视图结构应用程序 一、文档/视图结构分析 MFC 通过多个类提供了对程序框架的支持,使用这些类可以简单地实现文档/视图结构;其中主要包括以下五个类: 应用程序类(CWinAPP):是 MFC 程序的应用程序管理类,也是程序的入口类。 文档模板类(CDocTemplate):用于管理应用程序的一组文档视图框架框架类(CMainFrame):用于管理 Windows 对话框类,宽假对话框...

御承扬的博客 5827

MFC文档视图结构文档操作流程

文档视图结构操作流程 一基本架构 一个程序可以看作是建立在对文档进行处理的基础上的,而程序可处理的文档类型有可能有多种,同时每种文档又可能同时被打开多个视图,若在MDI程序中存在多个文档模板,这会在启动程序时显示一个新建对话框,其中每个条目显示一个文档模板字符串中第三个子串。每个文档又可分为数据部分和表现部分。 基于这种认识,MFC文档视图框架结构将各功能模块总结为对象,用相互关联的

mylinx的专栏 1538

MFC:文档/视图

MFC程序的结构包括两个面向应用的实体:文档视图文档是应用程序中与用户交互的数据集合。文档类是从MFC库中的CDocument类派生的,需要添加数据成员来存储应用程序需要的数据,还要添加成员函数来支持对数据的处理。MFC支持单文档界面(Sigle Document Interface,SDI),每次只打开一直文档的程序。MFC也支持多文档界面(Multiple Document Interface,MDI)。使用MDI,程序不仅能够打开类型相同的多个文档,还可以同时处理多个类型不同的文档,各个文档显示在

hd51cc的博客 2689

MFC文档视图结构

转载自:https://blog.csdn.net/u013407012/article/details/79778401感谢原创。 文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关数据处理的方法 分为数据的管理和显示,文档用于管理和维护数据,...

leoking01的专栏 758

文档/视图结构以及简单操作

文档/视图结构一、前言二、什么是文档/视图结构 我们MFC原理与方法的课程结束了,接下来我们要学习文档/视图结构。好了,废话不多说,咱们开始吧! 二、什么是文档/视图结构 文档/视图(Document/View)结构是使用MFC开发基于文档的应用程序最常用的基本框架。在这个框架中,数据及显示分别由两个不同但又彼此紧密相关的对象——文档视图负责的。具体地说,用户对数据

a2748786010的博客 1350

MFC浅析(1) 文档视图结构中,缺省的命令处理

文档视图结构中,缺省的命令处理<!-- body {color:black;font-family: "宋体"; font-size: 9pt} p {color:black;font-family: "宋体"; font-size: 9pt} pre {color:black;font-family: "宋体"; font-size: 9pt} t

FMD STUDIO 5981

MFC文档视图结构分析

文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自

D_daytime的博客 731

MFC文档视图结构分析

第 1 节            文档视图结构 MFC能够成为“应用程序框架”,最重要的东西除了巧妙地实现了消息循环,另一个很精华的东西可能就要算文档视图结构了。文档视图结构包含4个东西:文档视图框架文档模板,暂且我们把它称成4元素。其实它是仿照精典的MVC模式,将显示、控制逻辑、数据分离开来。在MFC中,文档存储数据,而View将数据显示出来,一个文档可以有多个视图,而一个视图却只能有一

shanhujiaofj的专栏 780

深入分析MFC文档视图结构

文章出处: http://www.cnblogs.com/k-eckel/articles/188489.html 深入分析MFC文档视图结构(项目实践)        k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的

Segen_Jaa的专栏 900
上一篇: MFC浅析(1) 文档视图结构中,缺省的命令处理
下一篇: MFC浅析(3) 文档视图结构中命令的处理流程
FMD
FMD
博客等级 码龄26年 10粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值