So wird 's gemacht: How to Support zwei Dateierweiterungen pro MFC-Dokumenttyp

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 141921 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Anwendungen, die mit dem Microsoft Foundation Classes (MFC)-Dokument oder Ansicht Architektur höchstens eine Dateierweiterung jedes Dokumenttyp zugeordnet haben, erstellt. Diese Standard-Dateierweiterung wird in die Dokument-Vorlage-Zeichenfolge in der Zeichenfolgentabelle gespeichert wenn angegeben, gespeichert.

Es ist oft nützlich, um ein bestimmtes Dokument zwei Dateierweiterungen zugeordnet. Dieser Artikel beschreibt eine Technik, mit denen Sie zwei Dateierweiterungen an, in dem Dokument Vorlage Zeichenfolge gespeichert werden können. Durch Klassenableitung und Funktionsüberschreibungen ist es möglich, Dokument Vorlage beide Dateierweiterungen zugeordnet.

Weitere Informationen

Schrittweise Prozedur

Verwenden Sie die folgenden Schritte zuordnen zwei Erweiterungen zu einem einzelnen Dokumenttyp in SDI- oder MDI-Anwendungen.

  1. Ändern Sie den Tabelleneintrag Zeichenfolge, sodass es zwei Dateierweiterungen enthält. Zwei Erweiterungen werden in Feld FilterExt durch Semikolons getrennt (z. B. .AAA; .BBB) eingegeben. Die Dokument-Vorlage-Zeichenfolge kann etwa so aussehen:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Leiten Sie eine Klasse von CMultiDocTemplate für MDI-Anwendungen oder CSingleDocTemplate für SDI-Anwendungen. Das Projekt diese Klasse hinzu, und Erstellung von Dokumentvorlagen in InitInstance verwenden-Funktion. Müssen Sie einen Konstruktor erstellen, die einfach den Basisklassenkonstruktor aufruft.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Die GetDocString-Funktion in Ihrer von CMultiDocTemplate oder CSingleDocTemplate in Schritt 2 abgeleiteten Klasse überschrieben.
       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 überschreiben, sodass beide Dateierweiterungen erkannt werden, wenn eine Datei geöffnet ist.
       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. Sie speichern und ordnungsgemäß als Funktion speichern, überschreiben die DoSave-Funktion in der CDocument abgeleitete Klasse. Einfach Ausschneiden und einfügen die MFC-Implementierung von CDocument::DoSave() aus Mfc\Src\Doccore.cpp in der abgeleiteten Klasse.

    Ersetzen Sie diese Zeilen:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    mit diesen Zeilen:
            // 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;
            }
    						
    der drei hinzugefügt Codezeilen die erste Erweiterung standardmäßig zurück, wenn speichern unter für einen Dokumenttyp verarbeitet wird, die zwei Erweiterungen in seiner Zeichenfolge Dokument angegeben wurde. Der Benutzer muss über diese Erweiterung eingeben, wenn eine Datei mit der zweiten Erweiterung in der Dokument-Zeichenfolge angegebenen gespeichert werden.

    Außerdem müssen Sie die folgenden Codezeilen zu ersetzen:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    mit:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    Dies ist erforderlich, da das DELETE_EXCEPTION()-Makro in diesem Kontext nicht definiert ist.
  6. (nur 16-Bit-Editionen) Verwenden Sie Klassen-Assistenten, um OnFileSave und OnFileSaveAs Befehlshandler in der abgeleiteten Dokumentklasse bereitzustellen. Dies ist notwendig, da in den 16-Bit-Versionen von Visual C++, das DoSave-Funktion ist nicht virtuell. Schneiden Sie einfach und fügen Sie des Inhalts der Basisklasse Versionen beide Funktionen von Mfc\Src\Doccore.cpp in der Befehlshandler ein. Die resultierenden Funktionen aufrufen, die lokale Kopie des DoSave statt der Basisklassenversion. Es möglicherweise erforderlich, fügen Sie # enthalten "io.h" zu Ihrem Projekt eine Definition für die _access-Funktion angeben.

Informationsquellen

Lesen Sie den folgenden Artikel der Microsoft Knowledge Base:
198538DocMgrEx.exe Assoc mehrere Dateierweiterungen w/1 Dokument eingeben

Eigenschaften

Artikel-ID: 141921 - Geändert am: Donnerstag, 7. Dezember 2006 - Version: 5.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2, wenn verwendet mit:
    • 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
Keywords: 
kbmt kbdocview kbhowto KB141921 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 141921
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

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