Adicionando vários modos de exibição a um único documento
Em um aplicativo de interface SDI (interface SDI (single-document interface)) (SDI) criado com a biblioteca Microsoft Foundation classe (MFC), cada tipo de documento está associado com um tipo de exibição único.Em alguns casos, é desejável ter a capacidade de comutador o modo de exibição corrente de um documento com um novo modo de exibição.
Dica: |
---|
Para obter os procedimentos adicionais sobre a implementação de vários modos de exibição para um único documento, consulte CDocument::AddView and the COLETAR Exemplo do MFC. |
Você pode implementar essa funcionalidade, adicionando um novo CView-derivada da classe e código adicional para alternar os modos de exibição dinamicamente para um aplicativo MFC.
sistema autônomo etapas são:
Modificar a classe de aplicativo existentes
Criar e modificar a nova classe de exibição
Criar e anexar o novo modo de exibição
Implementar a função de switching
Adicionar suporte para troca o modo de exibição
O restante deste tópico pressupõe o seguinte:
O nome do CWinApp-é derivado do objeto CMyWinApp, e CMyWinApp é declarada e definida no MYWINAPP.H e MYWINAPP.CPP.
CNewView é o nome da nova CView-derivados do objeto, e CNewView é declarada e definida no NEWVIEW.H e NEWVIEW.CPP.
Modificar a classe de aplicativo existentes
Para o aplicativo comutador entre os modos de exibição, você precisará modificar a classe de aplicativo, adicionando variáveis de membro para armazenar os modos de exibição e um método para alterná-los.
Adicione o seguinte código para a declaração de CMyWinApp em MYWINAPP.H:
CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );
As novas variáveis de membro, m_pOldView e m_pNewView, aponte para o modo de exibição corrente e o recém-criado. O novo método (SwitchView) alterna os modos de exibição quando solicitado pelo usuário. O corpo do método será abordado posteriormente neste tópico em Implementar a função de switching.
Última modificação para a classe de aplicativo necessita incluindo um novo arquivo de cabeçalho que define uma mensagem do Windows (WM_INITIALUPDATE) que é usado na função de comutação.
Inserir a linha seguinte na seção de MYWINAPP.CPP incluem:
#include <AFXPRIV.H>
Salvar as alterações e continuar a próxima etapa.
Criar e modificar a nova classe de exibição
Criar nova classe de modo de exibição é feita fácil usando o Nova classe comando de Modo de Exibição de Classe.O único requisito para essa classe é que ele deriva de CView. Adicione essa nova classe ao aplicativo.Para obter informações específicas sobre como adicionar uma nova classe ao projeto, consulte Adicionando uma classe.
Depois de adicionar a classe para o projeto, você precisará alterar a acessibilidade de alguns membros de classe de modo de exibição.
Modificar NEWVIEW.H alterando o especificador de acesso de protected para pública para o construtor e destruidor.Isso permite que a classe para serem criados e destruídos dinamicamente e modificar a aparência do modo de exibição antes que ele esteja visível.
Salvar as alterações e continuar a próxima etapa.
Criar e anexar o novo modo de exibição
Para criar e anexar o novo modo de exibição, você precisará modificar o InitInstance função de sua classe de aplicativo. A modificação adiciona o novo código que cria um novo objeto de exibição e, em seguida, inicializa os dois m_pOldView e m_pNewView com dois objetos de exibição existente.
Como o novo modo de exibição é criado dentro de InitInstance função, ambas as exibições novas e atuais persistem durante o tempo de vida do aplicativo. No entanto, o aplicativo pode com com facilidade criar o novo modo de exibição dinamicamente.
Inserir este código após a telefonar para ProcessShellCommand:
CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
m_pOldView = pActiveView;
m_pNewView = (CView*) new CNewView;
if (NULL == m_pNewView)
return FALSE;
CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
// Initialize a CCreateContext to point to the active document.
// With this context, the new view is added to the document
// when the view is created in CView::OnCreate().
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext.m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;
// The ID of the initial active view is AFX_IDW_PANE_FIRST.
// Incrementing this value by one for additional views works
// in the standard document/view case but the technique cannot
// be extended for the CSplitterWnd case.
UINT viewID = AFX_IDW_PANE_FIRST + 1;
CRect rect(0, 0, 0, 0); // Gets resized later.
// Create the new view. In this example, the view persists for
// the life of the application. The application automatically
// deletes the view when the application is closed.
m_pNewView->Create(NULL, _T("AnyWindowName"), WS_CHILD, rect, m_pMainWnd, viewID, &newContext);
// When a document template creates a view, the WM_INITIALUPDATE
// message is sent automatically. However, this code must
// explicitly send the message, as follows.
m_pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);
Salvar as alterações e continuar a próxima etapa.
Implementar a função de switching
Na etapa anterior, você adicionou o código que criado e inicializado um novo objeto de exibição.A última informação importante é implementar o método de switching, SwitchView.
No participante do arquivo de implementação para sua classe de aplicativo (MYWINAPP.CPP), adicione a seguinte definição de método:
CView* CMyWinApp::SwitchView( )
{
CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
CView* pNewView = NULL;
if(pActiveView == m_pOldView)
pNewView = m_pNewView;
else
pNewView = m_pOldView;
// Exchange view window IDs so RecalcLayout() works.
#ifndef _WIN32
UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
#else
UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
#endif
pActiveView->ShowWindow(SW_HIDE);
pNewView->ShowWindow(SW_SHOW);
((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
((CFrameWnd*) m_pMainWnd)->RecalcLayout();
pNewView->Invalidate();
return pActiveView;
}
Salvar as alterações e continuar a próxima etapa.
Adicionar suporte para troca o modo de exibição
A etapa final envolve a adição de código que chama o SwitchView método quando o aplicativo precisa para comutador entre os modos de exibição. Isso pode ser concluído de várias maneiras: Adicionar um novo item de menu para que o usuário escolher ou alternar os modos de exibição internamente quando determinadas condições forem atendidas.
Para obter mais informações sobre a adição de novos itens de menu e funções do manipulador de comando, consulte Manipuladores de comandos e notificações de controle.