Condividi tramite


Aggiunta di più visualizzazioni a un singolo documento

In un'applicazione di (SDI) di Single Document Interface) creata con la libreria MFC (Microsoft Foundation classes (MFC), ogni tipo di documento associato a un singolo tipo di visualizzazione. In alcuni casi, può essere utile avere la possibilità di passare la visualizzazione corrente di un documento con una nuova visualizzazione.

Suggerimento

Per le procedure aggiuntive sull'implementazione più visualizzazioni in un documento, vedere CDocument::AddView e l'esempio di In COLLECT MFC.

È possibile implementare questa funzionalità aggiungendo nuovo CView- classe derivata e altro codice per passare le visualizzazioni in modo dinamico a un'applicazione MFC esistente.

La procedura è la seguente:

  • Modificare la classe di applicazione esistente

  • Creare e modificare la nuova classe di visualizzazione

  • Creare e collegare la nuova visualizzazione

  • Implementare la funzione di commutazione

  • Aggiungere il supporto per alternare la visualizzazione

In questo argomento si presuppone la seguente:

  • Il nome di CWinAppl'oggetto derivato è CMyWinApp e CMyWinApp è dichiarata e definita in MYWINAPP.H e in MYWINAPP.CPP.

  • CNewView è il nome di un CViewl'oggetto derivato e CNewView è dichiarata e definita in NEWVIEW.H e in NEWVIEW.CPP.

Modificare la classe di applicazione esistente

Affinché l'applicazione di passare tra le visualizzazioni, è necessario modificare la classe di applicazione aggiungendo le variabili membro per archiviare le visualizzazioni e un metodo per passare.

Aggiungere il seguente codice alla dichiarazione di CMyWinApp in MYWINAPP.H:

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

Nuove variabili membro, m_pOldView e m_pNewView, selezionare la visualizzazione corrente e quello appena creato. Il nuovo metodo (SwitchView) passa le visualizzazioni quando richiesto dall'utente. Il corpo del metodo viene illustrata più avanti in questo argomento in Implementare la funzione di commutazione.

L'ultima modifica alla classe dell'applicazione richiede incluso un nuovo file di intestazione che definisce un messaggio di windows (WM_INITIALUPDATE) utilizzato nella funzione di commutazione.

Incollare la riga seguente nella sezione include di MYWINAPP.CPP:

#include <AFXPRIV.H>

Salvare le modifiche e continuare con il passaggio successivo.

Creare e modificare la nuova classe di visualizzazione

Creare una nuova classe di visualizzazione viene reso semplice tramite il comando di Nuova classe disponibile in Visualizzazione classi. L'unico requisito per questa classe è che deriva da CView. Aggiungere questa nuova classe all'applicazione. Per informazioni specifiche sull'aggiunta di una nuova classe al progetto, vedere Aggiunta di un classe.

Dopo aver aggiunto la classe al progetto, è necessario modificare l'accessibilità di alcuni membri della classe di visualizzazione.

Modificare NEWVIEW.H modificando l'identificatore di accesso da protected a public per il costruttore e il distruttore. In questo modo la classe da creare dinamicamente e distruzione e modificare l'aspetto di visualizzazione prima che sia visibile.

Salvare le modifiche e continuare con il passaggio successivo.

Creare e collegare la nuova visualizzazione

Per creare e associare la nuova visualizzazione, è necessario modificare la funzione di InitInstance dell'applicazione. La modifica aggiungi nuovo codice che crea un nuovo oggetto visualizzazione quindi inizializza sia m_pOldView che m_pNewView con i due oggetti visualizzazione esistenti.

Poiché la nuova visualizzazione viene creata all'interno della funzione di InitInstance, sia il nuovo visualizzate esistenti vengono mantenuti per la durata dell'applicazione. Tuttavia, l'applicazione potrebbe ad esempio possibile creare dinamicamente solo la nuova visualizzazione.

Incollare il codice dopo la chiamata 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);

Salvare le modifiche e continuare con il passaggio successivo.

Implementare la funzione di commutazione

Nel passaggio precedente, è stato aggiunto il codice che ha creato e inizializzato un nuovo oggetto visualizzazione. L'ultimo parte principale è l'implementazione del metodo di commutazione, SwitchView.

Alla fine del file di implementazione per la classe dell'applicazione (MYWINAPP.CPP), aggiungere la seguente definizione di metodo:

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;
} 

Salvare le modifiche e continuare con il passaggio successivo.

Aggiungere il supporto per alternare la visualizzazione

Il passaggio finale consiste nell'aggiungere il codice che chiama il metodo di SwitchView quando l'applicazione deve passare tra le visualizzazioni. Questa operazione può essere eseguita in diversi modi: aggiunta di una nuova voce di menu per la scelta dell'utente o passando le visualizzazioni internamente quando determinate condizioni sono soddisfatte.

Per ulteriori informazioni sull'aggiunta di voci di menu e delle nuove funzioni del gestore comando, vedere Gestori per i controlli e le notifiche di controllo.

Vedere anche

Concetti

Architettura documento/visualizzazione