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

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
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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
kbinf 1.50 1.51 1.52 2,00 2,50 3,00 3.10

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 141921 - Última Revisão: 12/04/2015 12:49:27 - Revisão: 5.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbdocview kbhowto KB141921 KbMtpt
Comentários