Cómo: Cómo extensiones de archivo de compatibilidad dos por tipo de documento MFC

Seleccione idioma Seleccione idioma
Id. de artículo: 141921 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Aplicaciones creadas con el documento de Microsoft Foundation Classes (MFC) o ver arquitectura tienen al menos una extensión archivo asociada con cada tipo de documento. Esta extensión de archivo predeterminado, si especifica, se almacena en la cadena de plantilla de documento almacenada en la tabla de cadenas.

A menudo resulta útil asociar dos extensiones de archivo con un tipo de documento determinado. Este artículo describe una técnica que puede utilizar para permitir que dos extensiones de archivo para almacenarse en la cadena de plantilla de documento. Mediante la derivación de clase y reemplazos de función, es posible asociar ambos extensiones de archivo con la plantilla de documento.

Más información

Procedimiento paso a paso

Utilice los pasos siguientes para asociar dos extensiones de archivo a un único tipo de documento en aplicaciones SDI o MDI.

  1. Modifique la entrada de la tabla de cadena para que contenga dos extensiones de archivo. Las dos extensiones se introducen en el campo filterExt separado por un punto y coma (por ejemplo, .AAA; .bbb). La cadena de plantilla de documento puede ser similar a esto:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Derivar una clase de CMultiDocTemplate para aplicaciones MDI o CSingleDocTemplate para aplicaciones SDI. Agregar esta clase al proyecto y utilizarlo al crear las plantillas de documento en la función InitInstance función. Tendrá que crear un constructor que simplemente llama al constructor de la clase base.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Reemplace la función GetDocString en su clase derivada de CMultiDocTemplate o CSingleDocTemplate en el paso 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. Reemplazar CMyMultiDocTemplate::MatchDocType para que ambas extensiones de archivo se reconocen cuando se abre un archivo.
       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. Fin de guardar y guardar como función correctamente, reemplace el DoSave función en la clase derivada de CDocument. Simplemente cortar y pegar la MFC implementación de CDocument::DoSave() desde Mfc\Src\Doccore.cpp en la clase derivada.

    Reemplace estas líneas:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    con estas líneas:
            // 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;
            }
    						
    agregarán de los tres líneas de código devuelven la primera extensión de forma predeterminada cuando se procesa de guardar como para un tipo de documento que tiene dos extensiones especificadas en su cadena de documento. El usuario debe escribir sobre esta extensión si un archivo se guardarán con la segunda extensión especificada en la cadena de documento.

    También necesitará reemplazar las siguientes líneas de código:
          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
          }
    						
    esto es necesario porque la macro DELETE_EXCEPTION() no está definida en este contexto.
  6. (sólo ediciones de 16 bits) Utilice el Asistente para clases para proporcionar OnFileSave y OnFileSaveAs controladores de comandos en la clase derivada de documento. Esto es necesario porque en versiones de 16 bits de Visual C++, la DoSave función no es virtual. Simplemente cortar y pegar el contenido de las versiones de clase base de ambas funciones de Mfc\Src\Doccore.cpp en los controladores de comandos. Las funciones resultantes, llame a la copia local de DoSave en lugar de la versión de la clase base. Puede ser necesario agregar # incluyen "io.h" al proyecto para proporcionar una definición de la función _access.

Referencias

Consulte el siguiente artículo de Microsoft Knowledge Base:
198538DocMgrEx.exe ASSOC varias extensiones de archivo w 1 tipo de documento

Propiedades

Id. de artículo: 141921 - Última revisión: jueves, 7 de diciembre de 2006 - Versión: 5.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • 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
Palabras clave: 
kbmt kbdocview kbhowto KB141921 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 141921
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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