Share via


Vistas de agregar varios a un documento Single

En una aplicación (SDI) de interfaz de un único documento creada con la biblioteca Microsoft (MFC) Foundation Class, cada tipo de documento está asociado a un tipo de la vista única.En algunos casos, es deseable tener la capacidad de cambiar la vista actual de un documento con una nueva vista.

SugerenciaSugerencia

Para los procedimientos adicionales en implementar varias vistas para un único documento, vea CDocument::AddView y el ejemplo de GET MFC.

Puede implementar esta funcionalidad agregar nuevo CView- clase derivada y código adicional para intercambiar las vistas dinámicamente a una aplicación MFC existente.

Éstos son los pasos:

  • Modifique la clase de la aplicación existente

  • Cree y Modifique la clase de la vista de Nuevo

  • Cree y asociar la vista New

  • Implemente la función de conmutación

  • Agregue compatibilidad para cambiar de vista

El resto de este tema se supone lo siguiente:

  • El nombre de CWinApp- el objeto derivado es CMyWinApp, y CMyWinApp es declarado y definidas en MYWINAPP.H y MYWINAPP.CPP.

  • CNewView es el nombre de nuevo CView- el objeto derivado, y CNewView es declarados y definido en NEWVIEW.H y NEWVIEW.CPP.

Modifique la clase de la aplicación existente

Para que la aplicación cambie entre las vistas, debe modificar la clase de aplicación agregando a variables miembro para almacenar las vistas y un método cambiar.

Agregue el código siguiente a la declaración de CMyWinApp en MYWINAPP.H:

CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );

Nuevas variables miembros, m_pOldView y m_pNewView, elija la vista actual y el recién creado.El nuevo método (SwitchView) cambia las vistas cuando es solicitado por el usuario.El cuerpo del método se describe más adelante en este tema en implemente la función de conmutación.

La modificación pasada a la clase de aplicación necesita con un nuevo archivo de encabezado que defina un mensaje de Windows (WM_INITIALUPDATE) que se usa en la función de modificadores.

Inserte la línea siguiente en la sección de inclusión de MYWINAPP.CPP:

#include <AFXPRIV.H>

Guarde los cambios y continúe con el paso siguiente.

Cree y Modifique la clase de la vista de Nuevo

Creando la nueva clase de vista se facilita utilizando el comando de New Class disponibles en la vista de clases.El único requisito para esta clase es que deriva de CView.Agregue esta nueva clase a la aplicación.Para obtener información concreta sobre cómo agregar una nueva clase al proyecto, vea agregar una clase.

Una vez que se ha agregado la clase al proyecto, debe cambiar la accesibilidad de algunos miembros de clase de vista.

Modifique NEWVIEW.H cambiando el especificador de acceso de protected a public para el constructor y el destructor.Esto permite que destruyea la clase se crea y dinámicamente y modificar el aspecto de la vista antes de que esté visible.

Guarde los cambios y continúe con el paso siguiente.

Cree y asociar la vista New

Para crear y asociar la nueva vista, debe modificar la función de InitInstance de la clase de aplicación.La modificación agrega el nuevo código que crea un nuevo objeto de vista y se inicializa m_pOldView y m_pNewView con los dos objetos de vista existentes.

Dado que la nueva vista se crea dentro de la función de InitInstance , el nuevo y las vistas existentes conservan para la duración de la aplicación.Sin embargo, la aplicación puede fácilmente crear la nueva vista dinámicamente.

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.

Implemente la función de conmutación

En el paso anterior, agrega el código que creó y inicializado un nuevo objeto de vista.El fragmento principal pasado es implementar el método de conmutación, SwitchView.

Al final del archivo de implementación para la clase de aplicación (MYWINAPP.CPP), agregue la definición de método siguientes:

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.

Agregue compatibilidad para cambiar de vista

El paso final implica agregar el código que llama al método de SwitchView cuando la aplicación necesita cambiar entre las vistas.Puede hacerlo de varias maneras: agregar un nuevo elemento de menú para que el usuario elija o cambiando 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 los comandos y notificaciones de Control.

Vea también

Conceptos

Arquitectura documento/vista