PROCEDURE: Ondersteuning voor twee bestands extensies per documenttype MFC

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
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Samenvatting
Toepassingen die zijn gemaakt met de Microsoft Foundation Classes (MFC) document ofweergave architectuur hebben hooguit een bestandsextensie die is gekoppeld aan elkdocumenttype. Deze standaard bestandsextensie, indien opgegeven, wordt opgeslagen in dedocument sjabloon teken reeks opgeslagen in de tabel van de teken reeks.

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

Stapsgewijze Procedure

Gebruik de volgende stappen uit twee bestandsextensies koppelen aan ééndocumenttype 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
kbinf 1,50 1.51 1,52 2,00 2,50 3.00 3. 10

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 141921 - Laatst bijgewerkt: 12/04/2015 12:49:26 - Revisie: 2.0

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbdocview kbhowto kbmt KB141921 KbMtnl
Feedback