程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在Visual C++中如何建立多模板文檔

在Visual C++中如何建立多模板文檔

編輯:vc教程

  我們知道,在一般的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 獲得應用程序對象指針,從而獲得相應的文檔模板指針。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved