Red de conocimiento informático - Material del sitio web - Cómo crear una vista en una interfaz de documento único usando Visual C++

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>

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;

}