MFC多文档和单文档视结构Word格式文档下载.docx
《MFC多文档和单文档视结构Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MFC多文档和单文档视结构Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
多文档打开:
CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
他们两个只有在docMultTemplate和docSingleTemplate的OpenDocumentFile函数中的动作不同,单文档负责新建框架类和视类但是如果存在了我们就不重建了,只是给其赋值。
而多文档无论如何都会新建一个视类和框架类文档类,这也就是为什么他是多文档结构的原因。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
接下来介绍这个最重要的函数,它基本什么都干了,不管是新建还是打开都得调用它,呵呵&
//
CDocument*CMultiDocTemplate:
:
OpenDocumentFile(LPCTSTRlpszPathName,
BOOLbMakeVisible)
{
//下面调用的是CDocTemplate:
CreateNewDocument()
CDocument*pDocument=CreateNewDocument();
//这里面调用了AddDocument(pDocument);
//添加了一个CMyMultiTestDoc:
publicCDocument
//CMultiDocTemplate:
m_docList保存的所有该种文档的
//文档实例的指针列表。
if(pDocument==NULL)
{
TRACE0("
CDocTemplate:
CreateNewDocumentreturnedNULL.\n"
);
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
returnNULL;
}
ASSERT_VALID(pDocument);
BOOLbAutoDelete=pDocument-&
m_bAutoDelete;
pDocument-&
m_bAutoDelete=FALSE;
//don'
tdestroyifsomethinggoeswrong
CFrameWnd*pFrame=CreateNewFrame(pDocument,NULL);
//创建了一个新的CChildFrame框架
m_bAutoDelete=bAutoDelete;
if(pFrame==NULL)
deletepDocument;
//explicitdeleteonerror
ASSERT_VALID(pFrame);
if(lpszPathName==NULL)
//createanewdocument-withdefaultdocumentname
SetDefaultTitle(pDocument);
//avoidcreatingtemporarycompoundfilewhenstartingupinvisible
if(!
bMakeVisible)
m_bEmbedded=TRUE;
pDocument-&
OnNewDocument())//刚打开时新建的文档。
addbyralf
//userhasbealertedtowhatfailedinOnNewDocument
CDocument:
OnNewDocumentreturnedFALSE.\n"
pFrame-&
DestroyWindow();
//itworked,nowbumpuntitledcount
m_nUntitledCount++;
else
//openanexistingdocument
CWaitCursorwait;
OnOpenDocument(lpszPathName))//这里是打开一个文档。
addbyralf
//userhasbealertedtowhatfailedinOnOpenDocument
OnOpenDocumentreturnedFALSE.\n"
SetPathName(lpszPathName);
InitialUpdateFrame(pFrame,pDocument,bMakeVisible);
returnpDocument;
}
要了解文档、视图、框架窗口、文档模板之间的相互关系,关键要理解他们的结构
1、首先应该对CWinApp类有充分的了解
它包含并管理着应用程序的文档/视窗的所有信息。
它有一个成员变量
CDocManager*m_pDocManager,此变量是文档/视窗的管理器,m_templateList
是CDocManager里的一个列表,此列表里保存了所有文档模板的指针,当用户调用
CWinApp:
AddDocTemplate(pDocTemplate)后该pDocTemplate存入了
m_pDocManager:
m_templateList里。
GetFirstDocTemplatePosition()
GetNextDocTemplate(POSITION&
amp;
pos)
是遍例所有的文档模板指针。
2、上面我们提到了文档模板(CMultiDocTemplate(我们主要针对对文档)),
这是一个极重要的类。
CMultiDocTemplate:
文档实例的指针列表。
下面两个函数用于维护CMultiDocTemplate:
m_docList数据
CMultiDocTemplate:
AddDocument(CDocument*pDoc);
RemoveDocument(CDocument*pDoc);
而CMultiDocTemplate:
GetFirstDocPosition()const;
CDocument*GetNextDoc(POSITION&
rPos)const;
用于遍例该文档类型所有文档实例。
3、上面提到文档(CDocument)
CDocument我们最熟悉不过了。
每一个文档实例可有多个视与之相对应。
CDocument:
m_viewList用来保存所有与此文档实例相关的View
★★★★这里我拉鲁夫说一下:
AddView函数用来维护m_viewList数据但我们一般不用★★★★
voidCDocument:
AddView(CView*pView)//★★★MFC源码
{
ASSERT_VALID(pView);
ASSERT(pView-&
m_pDocument==NULL);
//mustnotbealreadyattached
ASSERT(m_viewList.Find(pView,NULL)==NULL);
//mustnotbeinlist
m_viewList.AddTail(pView);
//mustbeun-attached
pView-&
m_pDocument=this;
OnChangedViewList();
//mustbethelastthingdonetothedocument
GetDocTemplate可获得CMultiDocTemplate;
4、CView他是放在CMDIChildWnd里的,每一个CMDIChildWnd有一个View
CView:
GetDocument可获得与此视相关的CDocument
GetParentFrame()可获得CMDIChildWnd;
通过以上分析可见CWinApp,CMDIChildWnd,CView,CDocument,CMultiDocTemplate之间知道其中一个实例
必可知道其他所有几个实例,CWinApp统领全局,任何时候,只要获得CWinApp实例,则所有的文档模板,
文档实例,视,Frame窗口均可被枚举出来。
AfxGetApp()获得CWinApp实例指针。
★★★★★最后我介绍一个最重要的:
其实我们一个文档一