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

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

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();

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值