Artigo: 129649 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 2.1

PROBLEMA: GetActiveView devolve NULL para uma janela de pacotes MDI

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sintomas

A função GetActiveView() devolve a vista activa (se existir) anexado a uma moldura de janela (CFrameWnd). Esta função devolve NULL quando chamado para uma janela de frame principal MDI (CMDIFrameWnd).

Causa

Numa aplicação MDI, a janela de frame principal MDI (CMDIFrameWnd) não tem uma vista associada. Em vez disso, cada janela subordinada individuais (CMDIChildWnd) tem um ou mais vistas associadas. Por conseguinte, uma chamada para a função GetActiveView() para uma janela de frame principal MDI devolve NULL. A secção "Mais informação" deste artigo fornece o esquema de janelas diferentes numa aplicação MDI.

Resolução

Para resolver o problema, localize o subordinado MDI activo janela (se existir) e, em seguida, chamada a função GetActiveView() para essa janela subordinada. A janela de subordinado MDI activa possível encontrar chamando a função MDIGetActive() ou GetActiveFrame(), como demonstrado neste código:
   CMDIFrameWnd *pFrame = (CMDIFrameWnd *)AfxGetApp()->m_pMainWnd;
   // Get the active MDI child window.
   CMDIChildWnd *pChild =
                  (CMDIChildWnd *) pFrame->GetActiveFrame();
   /* or CMDIChildWnd *pChild =
                  pFrame->MDIGetActive();
   */ 
   // Get the active view attached to the active MDI child window.
   CMyView *pView = (CMyView *) pChild->GetActiveView();
				

Mais Informação

A área de cliente da janela MDI moldura está coberta por janela do cliente referida como MDICLIENT, também conhecido como a área de trabalho. Esta janela de cliente por sua vez contém zero ou mais janelas de subordinadas, cada uma delas pode apresentar uma vista, tal como neste diagrama:
                    ---------------------------
                   |      Frame Window         |  ---> CMDIFrameWnd
                   | (main application window) |
                    ---------------------------
                             |
                    --------------------
                   |   Client Window    |  ---> MDICLIENT window class
                   | (no view attached) |
                    --------------------
                             |
         -----------------------------------------------------------
         |                            |
 ---------------------      --------------------
|   Child Window 1    |    |   Child Window 2   |  ---> CMDIChildWnd
| (one or more views) |    | (one or more views |
 ---------------------      --------------------
				
como ilustrado neste diagrama, a janela de moldura MDI não tem uma vista associada directamente. As vistas são realmente associadas às janelas de subordinado MDI.

Por este motivo, a chamar a função GetActiveView() para uma janela de frame principal MDI devolve nulo, que implica que não existe nenhuma vista diretamente associada MDICLIENT. É possível obter a vista activa numa aplicação MDI primeiro localizar MDI subordinado janela activa e, em seguida, localizar a vista activa para essa janela subordinada conforme descrito na secção resolução deste artigo.

Referências

"Programação Windows 3.1," Carlos Petzold, Microsoft prima, 1992.

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++ 5.0 Learning Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Professional Edition
Palavras-chave: 
kbmt kbcode kbdocview kbmdi kbprb kbuidesign KB129649 KbMtpt
Tradução automáticaTraduçã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: 129649  (http://support.microsoft.com/kb/129649/en-us/ )
Retired KB ArticleExclusã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.