HOWTO: 如何支援兩個檔案副檔名,每個 MFC 文件型別

文章翻譯 文章翻譯
文章編號: 141921 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

Microsoft 基礎類別 (MFC) 文件或架構有最多一個檔案副檔名與每個文件類型相關聯的檢視以建置應用程式。這個預設的檔案副檔名如果指定,儲存在文件樣板字串儲存在字串資料表中。

它通常是很有效與指定的文件類型建立關聯兩個副檔名。本文將告訴您,的技術,您可以使用,讓儲存在文件樣板字串中的兩個副檔名。透過類別的衍生和函式覆寫,很可能與文件樣板關聯這兩個檔案的副檔名。

其他相關資訊

逐步程序

使用下列步驟來使兩個檔案副檔名與 SDI 或 MDI 應用程式中的單一文件型別產生關聯。

  1. 使其包含兩個副檔名,請修改字串資料表項目。 兩個延伸會輸入到 [filterExt] 欄位以分號 (比方說.aaa ;.bbb) 隔開。文件樣板字串可能看來和以下相似:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. 從衍生類別 CMultiDocTemplate MDI 應用程式或 CSingleDocTemplate 對於 SDI 應用程式。將這個類別新增至您的專案,在您 InitInstance 中建立文件範本時用函式。您必須將建立只是呼叫基底類別建構函式的建構函式
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. 覆寫 GetDocString 函式,在您的類別在步驟 2 中衍生自 CMultiDocTemplate 或 CSingleDocTemplate
       BOOL CMyMultiDocTemplate::GetDocString(CString& rString,
                                enum DocStringIndex i) const
       {
            CString strTemp,strLeft,strRight;
            int nFindPos;
            AfxExtractSubString(strTemp, m_strDocStrings, (int)i);
    
            if(i == CDocTemplate::filterExt)  {
              nFindPos=strTemp.Find(';');
              if(-1 != nFindPos) {
                //string contains two extensions
                strLeft=strTemp.Left(nFindPos+1);
                strRight=strTemp.Right(lstrlen((const
                char*)strTemp)-nFindPos-1);
                strTemp=strLeft+strRight;
              }
            }
        rString = strTemp;
        return TRUE;
       }
    					
  4. 以便開啟的檔案時可辨識兩個檔案的副檔名會覆寫 CMyMultiDocTemplate::MatchDocType
       CDocTemplate::Confidence CMyMultiDocTemplate::MatchDocType(const
            char* pszPathName, CDocument*& rpDocMatch)
       {
            ASSERT(pszPathName != NULL);
            rpDocMatch = NULL;
    
            // go through all documents
            POSITION pos = GetFirstDocPosition();
            while (pos != NULL)
            {
               CDocument* pDoc = GetNextDoc(pos);
               if (pDoc->GetPathName() == pszPathName) {
                  // already open
                  rpDocMatch = pDoc;
                  return yesAlreadyOpen;
               }
            }  // end while
    
            // see if it matches either suffix
            CString strFilterExt;
            if (GetDocString(strFilterExt, CDocTemplate::filterExt) &&
              !strFilterExt.IsEmpty())
            {
               // see if extension matches
               ASSERT(strFilterExt[0] == '.');
               CString ext1,ext2;
               int nDot = CString(pszPathName).ReverseFind('.');
               const char* pszDot = nDot < 0 ? NULL : pszPathName + nDot;
    
               int nSemi = strFilterExt.Find(';');
               if(-1 != nSemi)   {
                 // string contains two extensions
                 ext1=strFilterExt.Left(nSemi);
                 ext2=strFilterExt.Mid(nSemi+2);
                 // check for a match against either extension
                 if (nDot >= 0 && (lstrcmpi(pszPathName+nDot, ext1) == 0
                     || lstrcmpi(pszPathName+nDot,ext2) ==0))
                   return yesAttemptNative; // extension matches
               }
               else
               { // string contains a single extension
                 if (nDot >= 0 && (lstrcmpi(pszPathName+nDot,
                     strFilterExt)==0))
                 return yesAttemptNative;  // extension matches
               }
            }
            return yesAttemptForeign; //unknown document type
       }
    					
  5. 若要儲存及另存新檔等函式正確,覆寫 [DoSave CDocument 衍生的類別中函式。只是剪下和貼上 [MFC 的從 Mfc\Src\Doccore.cpp CDocument::DoSave() 到您的衍生類別的實作。

    取代這行程式碼:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    具有這些線條:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
              ASSERT(strExt[0] == '.');
    
              int nSemi;                       //added
              if(nSemi = strExt.Find(';'));    //added
              strExt = strExt.Left(nSemi);     //added
    
              newName += strExt;
            }
    						
    的三個加入幾行程式碼傳回第一個副檔名的預設另存新檔] 處理具有兩個在其文件字串中指定的擴充程式的文件類型時。如果檔案是以第二個文件字串中指定的副檔名儲存,使用者必須鍵入透過這個延伸。

    您還需要取代下列幾行程式碼:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    與:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    這是必要的因為 DELETE_EXCEPTION() 巨集未定義在此內容中。
  6. (僅限 16 位元版本)使用類別精靈提供 OnFileSave 和 OnFileSaveAs 命令處理常式在您的衍生的文件類別。這是必要的因為 Visual C++,[DoSave 16 位元版本中函式不是虛擬。只是剪下並將 Mfc\Src\Doccore.cpp 來自這兩個函式基底類別版本的內容貼至命令處理常式。產生的函式呼叫 DoSave,而不是基底類別版本的本機複本。可能需要加入 # 包括"io.h 」 到您的專案提供 _access 函式的定義。

?考

請參閱下列的 「 Microsoft 知識庫 」 中的文件:
198538DocMgrEx.exe assoc 多個檔案的副檔名 w/1 Doc 輸入

屬性

文章編號: 141921 - 上次校閱: 2006年12月7日 - 版次: 5.1
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
關鍵字:?
kbmt kbdocview kbhowto KB141921 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:141921
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com