Cómo crear una vista en una interfaz de documento único usando Visual C++
Usar método de cambio de creación estática
1. Antes de que se muestre la ventana, se crean todos los objetos de vista que deben cambiarse, excepto la vista que se muestra primero, todos los demás se configuran con el atributo invisible cuando se crean.
CMyWinApp::InitInstance()
{ ......
m_pViews[0] = pView1; p> p>
m_pViews[1] = (CView*) nuevo CView2;
CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();
// Inicializa y crea punteros relacionados con el contexto
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext. m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;
//El ID de la vista inicialmente activada es AFX_IDW_PANE_FIRST,
//Aumente este valor para la vista recién creada; tenga en cuenta que CSplitterWnd no se puede utilizar de esta manera
UINT viewID[2];
viewID[1] = AFX_IDW_PANE_FIRST + 1;
CRect rect(0, 0, 0, 0);
for ( int nView=1; nView // Crear vistas nuevas y las vistas creadas existirán permanentemente en la aplicación hasta que ésta cierre. //La aplicación eliminará automáticamente las vistas recién creadas m_pViews[nView]->Crear (NULL, NULL, (AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE), // AFX_WS_DEFAULT_VIEW representa (WS_BORDER WS_VISIBLE WS_CHILD) rect, m_pMainWnd, viewID[nView], &newContext); } //Cuando la plantilla del documento crea una vista, enviará automáticamente el mensaje WM_INITIALUPDATE, // Entonces, para las vistas que creamos Vista, debe enviar este mensaje manualmente ((CForm2*)m_pViews[1])->OnInitialUpdate(); ( (CVswapView*)m_pViews[2])-> OnInitialUpdate(); ...... } 2. Cambio de vista CView* CMyWinApp::SwitchView( UINT nIndex ) { ASSERT( nIndex >=0 && nIndex < NUMVIEWS ); CView* pNewView = m_pViews[nIndex]; CView* pActiveView =((CFrameWnd*) m_pMainWnd)->GetActiveView(); if ( !pActiveView ) / / Actualmente no hay ninguna vista activa return NULL; if ( pN ewView == pActiveView ) //La vista actual es la misma que la vista que debe cambiarse return pActiveView; //Cambie el ID de la ventana de la vista para que RecalcLayout () puede funcionar 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); // Muestra la nueva vista y oculta la vista anterior pActiveView->ShowWindow( SW_HIDE); pNewView->ShowWindow(SW_SHOW); ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView); ((CFrameWnd*) ) m_pMainWnd)->RecalcLayout(); pNewView->Invalidate(); devolver pActiveView; }