COMO: Como extensões de ficheiros de suporte duas por tipo de documento 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 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
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
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
kbinf 1.50 1.51 1.52 2 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