如果依照前者的理解,的確,只有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);