PROCEDURE: Ondersteuning voor twee bestands extensies per documenttype MFC

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 141921 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

Toepassingen die zijn gemaakt met de Microsoft Foundation Classes (MFC) document of weergave architectuur hebben hooguit een bestandsextensie die is gekoppeld aan elk documenttype. Deze standaard bestandsextensie, indien opgegeven, wordt opgeslagen in de document sjabloon teken reeks opgeslagen in de tabel van de teken reeks.

Het is vaak handig om twee bestandsextensies koppelen aan een bepaald document type. Dit artikel beschrijft een techniek die u gebruiken kunt als u twee bestand extensies worden opgeslagen in de document sjabloon reeks. Via de klasse afleiding en functie overschrijvingen, is het mogelijk beide bestand koppelen de documentsjabloon extensies.

Meer informatie

Stapsgewijze Procedure

Gebruik de volgende stappen uit twee bestandsextensies koppelen aan één documenttype in SDI of MDI-toepassingen.

  1. De teken reeks tabel vermelding wijzigen zodat deze twee bestandsextensies bevat. De twee uitbreidingen zijn ingevoerd in het filterExt veld gescheiden door een punt komma (bijvoorbeeld, en met AAA;.bbb). Kan een teken reeks voor de document sjabloon ongeveer als volgt uitzien:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Een klasse is afgeleid van CMultiDocTemplate voor MDI-toepassingen, of CSingleDocTemplate SDI toepassingen. Deze klasse aan uw project toevoegen en deze gebruiken bij het maken van de document sjablonen die in de InitInstance functie. U moet maken van een constructor die gewoon roept de basis klassenconstructor.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. De functie GetDocString in uw klasse afgeleid negeren CMultiDocTemplate of CSingleDocTemplate in stap 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. CMyMultiDocTemplate::MatchDocType opheffen zodat beide bestands extensies worden herkend wanneer een bestand wordt geopend.
       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. Maken, opslaan en opslaan als functie correct, negeren de DoSave functie in de klasse die is afgeleid van CDocument. Gewoon knippen en plakken de MFC implementatie van CDocument::DoSave() van Mfc\Src\Doccore.cpp in de afgeleide klasse.

    Vervang deze regels:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    Met deze regels:
            // 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;
            }
    						
    De drie toegevoegd regels code de eerste uitbreiding standaard retourneren wanneer Opslaan als wordt voor een documenttype dat twee uitbreidingen verwerkt in de teken reeks document opgegeven. De gebruiker moet typen via deze extensie Als een bestand is opgeslagen met de tweede uitbreiding die is opgegeven in de document teken reeks.

    Ook moet u de volgende regels code vervangen:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    met:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    Dit is nodig omdat de macro DELETE_EXCEPTION() is niet gedefinieerd in deze context.
  6. (alleen 16-bits edities) Class Wizard gebruikt voor OnFileSave en OnFileSaveAs-opdracht handlers in uw document afgeleide klasse. Dit is noodzakelijk omdat in de 16-bits versies van Visual C++, de DoSave functie is virtueel. Gewoon knippen en plakken van de inhoud van de basis klasse versies van beide functies uit Mfc\Src\Doccore.cpp in de opdracht handlers. De resulterende functies aanroepen de lokale kopie van DoSave in plaats van de basis klassen versie. Mogelijk toevoegen # opnemen "io.h" aan het project voor een definitie voor de functie _access.

Referenties

Raadpleeg het volgende artikel in de Microsoft Knowledge Base:
198538Assoc meerdere bestandsextensies DocMgrEx.exe w/1 document Type

Eigenschappen

Artikel ID: 141921 - Laatste beoordeling: woensdag 23 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Foundation Class Library 4.2 op de volgende platformen
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
Trefwoorden: 
kbdocview kbhowto kbmt KB141921 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:141921
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

Geef ons feedback

 

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