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

Traduções deste artigo Traduções deste artigo
ID do artigo: 141921 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Aplicativos criados com o documento do Microsoft Foundation Classes (MFC) ou modo de exibição arquitetura ter no máximo uma extensão de arquivo associado a cada tipo de documento. Essa extensão de arquivo padrão, se especificado, será armazenado na seqüência de modelo de documento armazenada na tabela seqüência de caracteres.

Muitas vezes é útil para associar duas extensões de arquivo a um tipo determinado documento. Este artigo descreve uma técnica que você pode usar para permitir que duas extensões de arquivo seja armazenado na seqüência de modelo de documento. Por meio de derivação de classe e substituições de função, é possível associar as duas extensões de arquivo com o modelo de documento.

Mais Informações

Procedimento passo a passo

Use as seguintes etapas para associar duas extensões de arquivo com um tipo de documento único em aplicativos SDI ou MDI.

  1. Modifique a entrada de tabela de seqüência de caracteres de forma que ele contém duas extensões de arquivo. Duas extensões são inseridas no campo filterExt separado por um ponto-e-vírgula (por exemplo, .AAA; .bbb). A seqüência de modelo do documento pode parecer semelhante a este:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Derive uma classe CMultiDocTemplate para aplicativos MDI ou CSingleDocTemplate para aplicativos SDI. Adiciona esta classe para seu projeto e o utiliza ao criar os modelos de documento no seu CWinAppEx função. Você precisará criar um construtor que simplesmente chama o construtor da classe base.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Substituir a função GetDocString em sua classe derivada de CMultiDocTemplate ou CSingleDocTemplate na etapa 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 arquivo são reconhecidas quando um arquivo é aberto.
       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 tornar salvar e salvar como função corretamente, substituir o DoSave função em sua classe derivada de CDocument. Basta recortar e colar o MFC implementação de CDocument::DoSave() de Mfc\Src\Doccore.cpp em sua classe derivada.

    Substituir essas 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 retornam a primeira extensão por padrão quando salvar como é processada para um tipo de documento que tenha duas extensões especificadas na sua seqüência de documento. O usuário deve digitar sobre esta extensão se um arquivo deve ser salvo com a extensão segunda especificada na seqüência de documento.

    Você também precisará substituir as linhas de código a seguir:
          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
          }
    						
    isso é necessário porque a macro DELETE_EXCEPTION() não está definida neste contexto.
  6. (somente 16-bit Editions) Use o Assistente de classe para fornecer OnFileSave e OnFileSaveAs manipuladores de comandos na sua classe derivada de documento. Isso é necessário porque nas versões de 16 bits do Visual C++, o DoSave função não é virtual. Simplesmente recorte e cole o conteúdo de versões de ambas as funções de Mfc\Src\Doccore.cpp classe base para seus manipuladores de comandos. As funções resultantes chamam a cópia local do DoSave em vez da versão de classe base. Talvez seja necessário adicionar # incluem "io.h" para seu projeto 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 ASSOC várias extensões de arquivo w/1 tipo de documento

Propriedades

ID do artigo: 141921 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 141921
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

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