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

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
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
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
Kbinf 1.50 1.51, 1.52 2.00 2.50 3.00 3.10

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 141921 – Letzte Überarbeitung: 12/04/2015 12:49:20 – Revision: 5.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbdocview kbhowto KB141921 KbMtde
Feedback