我们在学习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)。
至此我要说的多文档的创建和打开的流程就是这样。希望大家批评指正。