我們知道,在一般的MDI應用程序中,只有一個文檔模板,程序只能打開一種類型的文檔。因此,只要調用File/New或者File/Open創建或者打開文檔即可,至於文檔、視和框架窗口之間的關系,則由文檔模板在幕後控制,不須要對文檔模板進行操作。但是,如果應用程序需要處理多種類型的文檔,並且何時打開何種文檔均需手工控制的話,此時,就必須對文檔模板進行編程。
例如,我們需要處理FIRST和SECOND兩種文件類型。其中FIRST和SECOND的數據存放格式不同,就不能用相同的數據結構來描述,因此,把它們的數據都存入一個文檔是不合適的,若FIRST和SECOND的視也是不同的(比如一個是圖像而另一個是聲音),因此,要解決這個問題只能分別建立兩套文檔模板,兩套框架窗口,兩套文檔和兩套視,分別用於存放和顯示FIRST和SECOND 的數據。並且程序可以根據文件名來分別處理FIRST和SECOND 類型的文件。其主要步驟如下:
(1)在應用程序類(CWinApp)的派生類的InitInstance()函數中修改相應部分,增加程序所處理的文檔模板,如下所示:
CMultiDocTemplate* pFirstDocTemplate;
pFirstDocTemplate = new CMultiDocTemplate(
IDR_FIRSTTYPE,
RUNTIME_CLASS(CFirstDoc), //指定第一種類型文件的文檔類
RUNTIME_CLASS(CFirstFrame), //指定第一種類型文件的子框架
RUNTIME_CLASS(CFirstVIEw)); //指定第一種類型文件的視
AddDocTemplate(pFirstDocTemplate); //為第一種類型的文檔添加模板
CMultiDocTemplate* pSecondDocTemplate;
pSecondDocTemplate = new CMultiDocTemplate(
IDR_SECONDTYPE,
RUNTIME_CLASS(CSecondDDoc), //指定第二種類型文件的文檔類
RUNTIME_CLASS(CSecondFrame), //指定第二種類型文件的子框架
RUNTIME_CLASS(CSecondVIEw)); //指定第二種類型文件的視
AddDocTemplate(pSecondDocTemplate); //為第二種類型的文檔添加模板
(2)在應用程序中增加菜單響應:
void CWinApp::OnFileOpen()
{
POSITION P = GetFirstDocTemplatePosition();
CFileDialog Dlg(true);
if(Dlg.DoModal()= =IDOK)
{
CString FileName = Dlg.GetPathName();
CString FileExt = Dlg.GetFileExt();
if((FileExt=="First")||(FileExt=="first")||(FileExt=="FIRST"))
{
while(P!=NULL)
{
CDocTemplate* curTemplate=GetNextDocTemplate(P);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if(str= =_T("First"))
{
curTemplate->OpenDocumentFile(FileName);
return;
}
}
}
else if((FileExt = = "Second") || (FileExt = = "second")||(FileExt= =SECOND"))
{
while(P!=NULL)
{
CDocTemplate* curTemplate=GetNextDocTemplate(P);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if(str==_T("Second"))
{
curTemplate->OpenDocumentFile(FileName);
return;
}
}
}else
{
// may not be supported
AfxMessageBox("你所選的文件類型本程序不支持!");
return;
}
}
}
這裡把文件名的後綴作為分支條件,如果是First類文件,則先獲得關於First類文件的文檔模板,然後調用CDocTemplate::OpenDocumentFile (lpszFileName)函數打開此文檔。此函數將依次生成新文檔,新框架,並在框架中創建視,最後向框架中所有的視發送初始化消息,使其顯示在屏幕上。如果是Second類文件,操作類似。
當然,我們還可以在程序的任何位置實現此操作:通過全局函數AfxGetApp 獲得應用程序對象指針,從而獲得相應的文檔模板指針。