COMO: Como extensões de ficheiros de suporte duas por tipo de documento MFC

Traduções de Artigos Traduções de Artigos
Artigo: 141921 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Aplicações com o documento de Microsoft Foundation Classes (MFC) ou vista a arquitectura tenha no máximo um ficheiro de extensão associada cada tipo de documento. Esta extensão de ficheiro predefinido, se especificado, é armazenada na cadeia de modelo de documento armazenada na tabela de cadeia.

Muitas vezes é útil associar duas extensões de ficheiro um tipo de dado documento. Este artigo descreve uma técnica que pode utilizar para permitir duas extensões de ficheiro seja armazenada na cadeia de modelo de documento. Através de derivação de classe e substituições de função, é possível associar ambas as extensões de ficheiro modelo do documento.

Mais Informação

Procedimento passo a passo

Utilize os seguintes passos para associar duas extensões de ficheiro com um tipo de documento único em aplicações SDI ou MDI.

  1. Modificar a entrada de tabela de cadeia de modo a que contém duas extensões de ficheiro. Duas extensões são introduzidas no campo filterExt separado por ponto e vírgula (por exemplo, .AAA; .BBB). A cadeia de modelo de documento poderá ser semelhante ao seguinte:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Deriva uma classe CMultiDocTemplate para aplicações MDI ou CSingleDocTemplate para aplicações SDI. Adicionar esta classe para o projecto e, utilizá-la ao criar os modelos de documento no seu InitInstance função. Terá de criar um construtor que simplesmente chame o Construtor de classe base.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Substituir a função GetDocString a classe derivada de CMultiDocTemplate ou CSingleDocTemplate no passo 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. Substituir CMyMultiDocTemplate::MatchDocType para que ambas as extensões de ficheiro são reconhecidas quando for aberto um ficheiro.
       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. Para guardar e guardar como função correctamente, substituir o DoSave função na sua classe derivada de CDocument. Cortar e colar o MFC simplesmente implementação CDocument::DoSave() de Mfc\Src\Doccore.cpp para a classe derivada.

    Substituir estas linhas:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    com estas linhas:
            // 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;
            }
    						
    adicionado a três linhas de código devolvem a primeira extensão por predefinição, quando guardar como é processada para um tipo de documento que tenha duas extensões especificadas na cadeia respectiva documento. O utilizador tem de escrever sobre esta extensão, se um ficheiro deve ser guardado com a extensão segunda especificada na cadeia de documento.

    Também terá de substituir as seguintes linhas de código:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    com:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    isto é necessário porque a macro DELETE_EXCEPTION() não está definida neste contexto.
  6. (apenas para edições de 16 bits) Utilize o Assistente de classe para fornecer OnFileSave e OnFileSaveAs processadores de comando na classe derivada de documento. Isto é necessário porque nas versões de 16 bits do Visual C++, o DoSave função não é virtual. Basta cortar e colar o conteúdo de versões de ambas as funções de Mfc\Src\Doccore.cpp classe base para os processadores de comandos. As funções resultantes chamar a cópia local do DoSave em vez da versão de classe base. Poderá ser necessário adicionar # incluem "io.h" ao projecto para fornecer uma definição para a função _access.

Referências

Consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
198538DocMgrEx.exe extensões de ficheiros ASSOC vários w/1 tipo de documento

Propriedades

Artigo: 141921 - Última revisão: 7 de dezembro de 2006 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes 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
Palavras-chave: 
kbmt kbdocview kbhowto KB141921 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 141921
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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