Condividi tramite


Visualizzazioni di più a un singolo documento

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

SuggerimentoSuggerimento

Per le procedure aggiuntive sull'implementazione più visualizzazioni per un singolo documento, vedere CDocument::AddView e dell'esempio In COLLECT MFC.

È possibile implementare questa funzionalità aggiungendo nuovo CViewclasse derivata da 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 associare la nuova visualizzazione

  • Implementare la funzione di alternanza

  • Aggiungere il supporto per passare alla vista

Il resto di questo argomento si presuppongono le seguenti condizioni:

  • Il nome di CWinAppoggetto derivato da è CMyWinAppe CMyWinApp viene dichiarata e definita in MYWINAPP.H e in MYWINAPP.CPP.

  • CNewView è il nome del nuovo CViewoggetto derivato da e CNewView è dichiarati e definiti in NEWVIEW.H e in NEWVIEW.CPP.

Modificare la classe di applicazione esistente

Applicazione per passare tra le visualizzazioni, è necessario modificare la classe dell'applicazione aggiungendo le variabili membro per archiviare le visualizzazioni e un metodo per passare.

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

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

Nuove variabili membro, m_pOldView e m_pNewView, passaggio alla 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 vengono Implementare la funzione di alternanza.

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.

Inserire la seguente riga nella sezione di inclusione 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 prodotto semplice tramite il comando di New Class disponibile in Visualizzazione classi.L'unico requisito necessario per questa classe è derivata 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 in modo dinamico ed eliminare e modificare l'aspetto di visualizzazione prima che sia visibile.

Salvare le modifiche e continuare con il passaggio successivo.

Creare e associare la nuova visualizzazione

Per creare e associare la nuova visualizzazione, è necessario modificare la funzione di InitInstance dell'applicazione.La modifica aggiunge il nuovo codice che crea un nuovo oggetto visualizzazione e 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 che le visualizzazioni esistenti vengono mantenuti per la durata dell'applicazione.Tuttavia, l'applicazione potrebbe come creare facilmente solo dinamicamente la nuova visualizzazione.

Inserire 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 alternanza

Nel passaggio precedente, è stato aggiunto il codice che ha creato e inizializzato un nuovo oggetto visualizzazione.L'ultima parte principale è implementare il metodo di alternanza, SwitchView.

Alla fine del file di implementazione per la classe dell'applicazione (MYWINAPP.CPP), aggiungere la definizione seguente del 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 passare alla vista

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 o passando le visualizzazioni internamente quando determinate condizioni seguenti.

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

L'architettura documento/visualizzazione