如果依照前者的理解,的确,只有cmultidoctemplate才能实现多文档,
CSingleDocTemplate *pDocTemplate;
pDocTemplate=new CSinlgeDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)
pDocTemplate=new CSingleDocTeplate(IDR,
CRunTimeClass(mydoc2),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)
依旧还是单文档(按前者理解),因为它不能同时打开mydoc1和mydoc2
2.我想说明一下Multidoctemplate的“multi”的作用: 我觉得,“multi”并不是说仅仅靠一个“CMultiDocTeplate对象,然后把mydoc1和mydoc2
分别加到CPtrList m_docList中去”,就可以实现打开多种类型的文档!“Multi”仅仅是说能够“同时”打开多个文档,一个"CMultiDocTeplate对象"只能打开一种类型的文档.您希望您的程序支持多少种类型的文档,您就必须构造多少个"CMultiDocTeplate对象". CMultiDocTeplate对象的成员变量CPtrList m_docList只是指向该"CMultiDocTeplate对象"能支持的文档”,并且他们是“同一种”类型的(也就是说当您仅仅定义了:
Multidoctemplate * pDocTemplate=new CMultiDocTeplate(IDR,
CRunTimeClass(mydoc1),CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate) 时,您的程序其实仅仅支持一“种”文档————mydoc1类型的文档,只不过可以同时打开很多“个”“这种类型”的文档I
而用"CSingleDocTeplate"的弱点在哪里呢?其实CSingleDocTeplate程序也能打开多种类型的文档,您定义了多少个CSingleDocTeplate对象,您的程序就能支持多少种文档,只不过,它们不能同时打开罢了.
另一位高人的见解(我比较赞成这个,偏重应用)
单文档、多文档首先是从我们现实使用中而来的,我们同一个程序需要处理多个文档时,其框架结构就会有所变化。
目前单文档结构一般只允许你对一个文档进行操作,我们也可以同时对两个相同类型的文档进行操作,如果用户需要这样的操作,它可以启动两个进程。所以我们在设计程序时可以只关注对同一种文档而且只有一个文档的情况进行设计。
而多文档可以处理多种类型的文档,每一种文档也可以打开多个,这是因为既然我已经需要处理多个框架了,我就可以较为轻松的实现对同一类型文档的多个不同文档进行编辑,而不需要多个进程。
因此,MFC的设计者根据以上的情况设计了两种不同类型的文档模版来处理这种问题,当然你完全可以自己处理一下CSingleDocTemplate,使得其支持多个文档(同一类型)甚至你完全可以处理多个不同类型的文档。
JJHOU在"深入浅出"中说过:
并不能说采用CSingleDocTemplate的程序就是SDI程序。我现在赞成SDI是指只有一套frame、menu、toolbar、statusbar,即使它有多个view.
多文档中,因为有ChildFrame,即使你只用一个文档,但是你可以用多个DocTemplate,这样,你显示的时候,可以用不同的 frame,frame中有不同的view,每个frame可以有自己的 menu,toolbar,statusbar ,有多种的显示方式。
在单文档中,只有一个MainFrame.虽然可以达到多个view,但是只有一个frame.
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MOUSECTYPE,
RUNTIME_CLASS(CMouseCapDoc),
RUNTIME_CLASS(CChildFrame), // CMultiDocTemplate与子窗口有关的
RUNTIME_CLASS(CMouseCapView));
AddDocTemplate(pDocTemplate);
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSingleDocDoc),
RUNTIME_CLASS(CMainFrame), //CSingleDocTemplate与主窗口有关的
RUNTIME_CLASS(CSingleDocView));
AddDocTemplate(pDocTemplate);