Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En una aplicación de interfaz de documento único (SDI) creada con la biblioteca Microsoft Foundation Class (MFC), cada tipo de documento está asociado a un tipo de vista único. En algunos casos, es conveniente tener la capacidad de cambiar la vista actual de un documento con una nueva vista.
Sugerencia
Para obtener procedimientos adicionales sobre la implementación de varias vistas para un único documento, vea CDocument::AddView y el ejemplo COLLECT MFC.
Puede implementar esta funcionalidad agregando una nueva CViewclase derivada y código adicional para cambiar las vistas dinámicamente a una aplicación MFC existente.
Los pasos son los siguientes:
En el resto de este tema se da por hecho lo siguiente:
El nombre del
CWinAppobjeto derivado esCMyWinAppyCMyWinAppse declara y se define en MYWINAPP. H y MYWINAPP. CPP.CNewViewes el nombre del nuevoCViewobjeto derivado yCNewViewse declara y se define en NEWVIEW. H y NEWVIEW. CPP.
Modificar la clase de aplicación existente
Para que la aplicación cambie entre vistas, debe modificar la clase de aplicación agregando variables miembro para almacenar las vistas y un método para cambiarlas.
Agregue el código siguiente a la declaración de CMyWinApp en MYWINAPP. H:
CView *m_pOldView;
CView *m_pNewView;
CView *SwitchView();
Las variables miembro nuevas, m_pOldView y m_pNewView, apuntan a la vista actual y a la recién creada. El nuevo método (SwitchView) cambia las vistas cuando el usuario lo solicita. El cuerpo del método se describe más adelante en este tema en Implementar la función de conmutación.
La última modificación de la clase de aplicación requiere incluir un nuevo archivo de encabezado que define un mensaje de Windows (WM_INITIALUPDATE) que se usa en la función de conmutación.
Inserte la siguiente línea en la sección include de MYWINAPP. CPP:
#include <AFXPRIV.H>
Guarde los cambios y continúe con el paso siguiente.
Crear y modificar la nueva clase view
La creación de la nueva clase de vista se facilita mediante el comando Nueva clase disponible en la vista de clases. El único requisito de esta clase es que deriva de CView. Agregue esta nueva clase a la aplicación. Para obtener información específica sobre cómo agregar una nueva clase al proyecto, vea Agregar una clase.
Una vez que agregue la clase al proyecto, deberá cambiar la accesibilidad de algunos miembros de la clase de vista.
Modifique NEWVIEW. H cambiando el especificador de acceso de protected a public para el constructor y destructor. Esto permite crear y destruir dinámicamente la clase y que modifique la apariencia de la vista antes de que sea visible.
Guarde los cambios y continúe con el paso siguiente.
Crear y adjuntar la nueva vista
Para crear y adjuntar la nueva vista, debe modificar la función InitInstance de la clase de su aplicación. La modificación agrega código nuevo que crea un nuevo objeto de vista y luego inicializa tanto m_pOldView como m_pNewView con los dos objetos de vista existentes.
Dado que la nueva vista se crea dentro de la InitInstance función , las vistas nuevas y existentes se conservan durante la vigencia de la aplicación. Sin embargo, la aplicación podría crear la nueva vista de forma dinámica.
Inserte este código después de la llamada a 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);
Guarde los cambios y continúe con el paso siguiente.
Implementar la función de conmutación
En el paso anterior, agregó código que creó e inicializó un nuevo objeto de vista. El último componente clave es implementar el método de conmutación, SwitchView.
Al final del archivo de implementación de la clase de aplicación (MYWINAPP). CPP), agregue la siguiente definición 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;
}
Guarde los cambios y continúe con el paso siguiente.
Agregar compatibilidad para cambiar la vista
El paso final implica agregar código que llama al SwitchView método cuando la aplicación necesita cambiar entre vistas. Esto se puede hacer de varias maneras: agregando un nuevo elemento de menú para que el usuario elija o cambie las vistas internamente cuando se cumplan ciertas condiciones.
Para obtener más información sobre cómo agregar nuevos elementos de menú y funciones de controlador de comandos, vea Controladores para comandos y notificaciones de control.