HOWTO : Comment les extensions de fichier de prise en charge deux par type de document MFC

Traductions disponibles Traductions disponibles
Numéro d'article: 141921 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Applications générées avec le document MFC (Microsoft Foundation Classes) ou une vue architecture avoir au plus une extension du fichier associée à chaque type de document. Cette extension de fichier par défaut, si spécifié, est stockée dans la chaîne de modèle de document stockée dans la table de chaînes.

Il est souvent utile d'associer deux extensions de fichier à un type de document donné. Cet article décrit une technique que vous pouvez utiliser pour autoriser deux extensions de fichier à stocker dans la chaîne de modèle de document. Par le biais de dérivation de classe et les substitutions de fonctions, il est possible d'associer les deux extensions de fichier avec le modèle de document.

Plus d'informations

Procédure pas à pas

Utilisez les étapes suivantes pour associer deux extensions de fichier à un type de document unique dans les applications SDI ou MDI.

  1. Modifiez l'entrée de table de chaîne pour qu'il contienne deux extensions de fichier. Les deux extensions sont entrées dans le champ filterExt séparé par un point-virgule (par exemple, .aaa ; .bbb). La chaîne de modèle de document peut ressembler à ceci :
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Dérivez une classe à partir de CMultiDocTemplate pour les applications MDI ou CSingleDocTemplate pour les applications SDI. Ajouter cette classe à votre projet et l'utiliser lorsque vous créez les modèles de document dans votre InitInstance fonction. Vous devrez créer un constructeur qui appelle simplement le constructeur de classe de base.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Substituez la fonction GetDocString dans votre classe dérivée de CMultiDocTemplate ou CSingleDocTemplate dans étape 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. Substituer CMyMultiDocTemplate::MatchDocType afin que les deux extensions de fichier sont reconnues lors de l'ouverture d'un fichier.
       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. Pour enregistrer et enregistrer sous fonction correctement, substituez le DoSave fonction dans votre classe dérivée de CDocument. Simplement coupez et collez la MFC mise en ?uvre de CDocument::DoSave() de Mfc\Src\Doccore.cpp dans votre classe dérivée.

    Remplacez ces lignes :
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    avec ces lignes :
            // 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;
            }
    						
    d'ajouter les trois lignes de code renvoient la première extension par défaut lors de l'enregistrer sous est traité pour un type de document qui a deux extensions spécifiées dans sa chaîne de document. L'utilisateur doit taper sur cette extension si un fichier doit être enregistré avec l'extension deuxième spécifiée dans la chaîne de document.

    Vous devez également remplacer les lignes de code suivantes :
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    avec :
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    Ceci est nécessaire parce que la macro DELETE_EXCEPTION() n'est pas définie dans ce contexte.
  6. (uniquement pour les éditions de 16 bits) Assistant classe permet de fournir des gestionnaires de commandes OnFileSave et OnFileSaveAs dans votre classe document dérivée. Cela est nécessaire car dans les versions 16 bits de Visual C++, le DoSave fonction n'est pas virtuelle. Simplement, coupez et collez le contenu des versions de classe de base de ces deux fonctions à partir de Mfc\Src\Doccore.cpp dans vos gestionnaires de commandes. Les fonctions qui en résulte appellent la copie locale de DoSave plutôt que la version de la classe de base. Il peut s'avérer nécessaire d'ajouter # inclure «io.h» à votre projet pour fournir une définition de la fonction _access.

Références

Veuillez consulter l'article suivant dans la base de connaissances Microsoft :
198538DocMgrEx.exe extensions de fichiers ASSOC multiple w 1 type de document

Propriétés

Numéro d'article: 141921 - Dernière mise à jour: jeudi 7 décembre 2006 - Version: 5.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 1.0 Édition Professionnelle
    • Microsoft Visual C++ 1.5 Édition Professionnelle
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Édition Professionnelle
    • Microsoft Visual C++ 2.0 Édition Professionnelle
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Édition Standard
Mots-clés : 
kbmt kbdocview kbhowto KB141921 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 141921
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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