HOWTO: Come le estensioni del file di supporto 2 per ogni tipo di documento MFC

Traduzione articoli Traduzione articoli
Identificativo articolo: 141921 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Applicazioni create con il documento di Microsoft Foundation Classes (MFC) o la visualizzazione architettura almeno una estensione file associata ciascun tipo di documento. Questa estensione di file predefinito, se specificato, viene memorizzata nella stringa di modello di documento archiviata nella tabella stringa.

Spesso è utile associare due estensioni di file a un tipo di documento specificato. Questo articolo viene descritto una tecnica che è possibile utilizzare per consentire due estensioni di file da archiviare nella stringa di modello di documento. Mediante la derivazione di classe e l'override di funzioni, è possibile associare entrambe estensioni di file con il modello di documento.

Informazioni

Procedure dettagliate

Attenersi alla seguente procedura per associare due estensioni di file a un tipo di documento singolo nelle applicazioni SDI o MDI.

  1. Modificare la voce di tabella di stringa in modo che contenga due estensioni di file. Due estensioni vengono immessi nel campo filterExt separato da un punto e virgola (ad esempio, .AAA; .BBB). La stringa del modello di documento potrebbe essere simile al seguente:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Derivare una classe da CMultiDocTemplate per le applicazioni MDI o CSingleDocTemplate per le applicazioni SDI. Aggiunta questa classe al progetto e utilizzarlo durante la creazione di modelli di documento in InitInstance funzione. Sarà necessario creare un costruttore che chiama semplicemente il costruttore della classe base.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. L'override della funzione GetDocString nella classe derivata da CMultiDocTemplate o CSingleDocTemplate nel passaggio 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. Eseguire l'override CMyMultiDocTemplate::MatchDocType affinché entrambe le estensioni file vengono riconosciute quando viene aperto un file.
       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. Per rendere Salva e Salva con nome funzione correttamente, eseguire l'override di DoSave funzione nella classe derivata da CDocument. È sufficiente tagliare e incollare MFC implementazione di CDocument::DoSave() da Mfc\Src\Doccore.cpp nella classe derivata.

    Sostituire queste righe:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    con queste righe:
            // 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;
            }
    						
    il tre aggiunte righe di codice restituiscono l'estensione prima per impostazione predefinita, quando Salva viene elaborato per un tipo di documento che dispone di due estensioni, specificate nella relativa stringa di documento. Se un file deve essere salvato con estensione secondo specificato nella stringa di documento, l'utente deve digitare in questa estensione.

    Sarà inoltre necessario sostituire le seguenti righe di codice:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    con:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    questo è necessario perché la macro DELETE_EXCEPTION() non è definita in questo contesto.
  6. (solo per 16-bit Edition) Utilizzare Creazione guidata classe per fornire i gestori comando OnFileSave e OnFileSaveAs nella classe documento derivata. Questa operazione è necessaria perché nelle versioni a 16 bit di Visual c ++, il DoSave funzione non virtuale. Semplicemente tagliare e incollare il contenuto di versioni di entrambe le funzioni da Mfc\Src\Doccore.cpp classe base nei gestori dei comandi. Le funzioni risultante chiamano la copia locale del DoSave anziché la versione della classe base. Potrebbe essere necessario aggiungere # include "io.h" al progetto per fornire una definizione per la funzione _access.

Riferimenti

Vedere il seguente articolo della Microsoft Knowledge Base riportato di seguito:
198538Tipo di documento DocMgrEx.exe estensioni di file più associazioni w/1

Proprietà

Identificativo articolo: 141921 - Ultima modifica: giovedì 7 dicembre 2006 - Revisione: 5.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Foundation Class Library 4.2 alle seguenti piattaforme
    • 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
Chiavi: 
kbmt kbdocview kbhowto KB141921 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 141921
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.

Invia suggerimenti

 

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