Postupy: Postup rozšíření podpory dvě soubor za typ dokladu MFC

Překlady článku Překlady článku
ID článku: 141921 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Aplikace sestavené pomocí Microsoft Foundation Classes (MFC) dokumentu nebo zobrazení architektura mít nejvýše jednu příponu souboru přidružené každý typ dokumentu. Tato výchozí přípona souboru-li zadán, je uložen v řetězci šablony dokumentu uloženy v tabulce řetězec.

Je často užitečné přidružit dvěma příponami typ daný dokument. Tento článek popisuje techniku můžete povolit dvě rozšíření souboru uloženou v řetězci šablonu dokumentu. Prostřednictvím odvození třídy a přepíše funkce je možné přidružit šablonu dokumentu obou přípony souborů.

Další informace

Podrobný postup

Následujícím postupem přidružit dvěma příponami typ jediný dokument v aplikacích SDI nebo MDI.

  1. Položka řetězec tabulky upravit tak, aby obsahuje dvě rozšíření souboru. Dvě rozšíření jsou zadány do pole filterExt odděleny středníkem (například .aaa; .bbb). Řetězec šablony dokumentu může vypadat podobně jako tento:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Odvození třídy z CMultiDocTemplate aplikace MDI nebo CSingleDocTemplate pro aplikace SDI. Přidání této třídy do projektu a použít při vytváření šablony dokumentu v InitInstance své funkce. Bude nutné vytvořit konstruktor jednoduše volání konstruktoru základní třídy.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Přepsat funkci GetDocString vaší třídy odvozené od CMultiDocTemplate nebo CSingleDocTemplate v kroku 2.
       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. Přepsat tak, aby obě přípony souborů jsou rozpoznány při otevření souboru 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. Chcete-li uložit a uložit jako funkce správně, přepsat DoSave funkce CDocument odvozené třídy. Jednoduše Vyjmout a vložit MFC implementace CDocument::DoSave() z Mfc\Src\Doccore.cpp do odvozené třídy.

    Nahradit tyto řádky:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    s tyto řádky:
            // 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;
            }
    						
    přidán tři řádky kódu vrátit první rozšíření ve výchozím nastavení uložit jako zpracovány pro typ dokumentu, který má dvě rozšíření zadaný řetězec jeho dokumentu. Uživatel musí zadat přes toto rozšíření, pokud je soubor uložen s příponou druhé určené v dokumentu řetězec.

    Bude také nutné nahradit následující řádky kódu:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    s:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    Toto je nezbytné, protože makro DELETE_EXCEPTION() Nedefinovaný v tomto kontextu.
  6. (pouze 16bitové verze) Pomocí Průvodce třídy poskytují OnFileSave a OnFileSaveAs příkaz rutiny třídy odvozené dokumentu. To je nutné, protože 16bitové verze aplikace Visual C++, DoSave funkce není virtuální. Jednoduše Vyjmout a vložit obsah verze základní třídy z Mfc\Src\Doccore.cpp obou funkcí do příkazu obsluhy. Výsledný funkce volání místní kopii DoSave spíše než verze základní třídy. Pravděpodobně bude nutné přidat # zahrnout "io.h" do projektu poskytují definice funkce _access.

Odkazy

Další informace naleznete v následujícím článku databáze Microsoft Knowledge Base:
198538Více přidružení přípon souborů DocMgrEx.exe w/1 typ dokumentu

Vlastnosti

ID článku: 141921 - Poslední aktualizace: 7. prosince 2006 - Revize: 5.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • 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
Klíčová slova: 
kbmt kbdocview kbhowto KB141921 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:141921
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

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