Partager via


Ajouter des vues multiples à un document unique

Dans une application interface (SDI) mono document (SDI créée à l'aide de la bibliothèque (MFC) MFC, chaque type de document est associé à un seul type de vue.Dans certains cas, il est souhaitable d'avoir la possibilité de basculer l'affichage actuel d'un document avec une nouvelle vue.

ConseilConseil

Pour les procédures supplémentaires sur l'implémentation de plusieurs vues pour un document unique, consultez CDocument::AddView et l'exemple de COLLECT MFC.

Vous pouvez implémenter ces fonctionnalités en ajoutant nouvel CViewclasse dérivée de et du code supplémentaire pour basculer les vues dynamiquement à une application MFC existante.

Les étapes sont les suivantes :

  • Modifiez la classe d'application existant

  • Créez et modifiez la classe d'affichage

  • Créez et placez la nouvelle vue

  • Implémentez la fonction de basculement

  • Ajoutez une prise en charge pour basculer la vue

Le reste de cette rubrique suppose ce qui suit :

  • Le nom d' CWinApp- l'objet dérivé est CMyWinApp, et CMyWinApp est déclaré et défini dans MYWINAPP.H et MYWINAPP.CPP.

  • CNewView est le nom du nouvel CView- l'objet dérivé, et l' CNewView est déclaré et défini dans NEWVIEW.H et NEWVIEW.CPP.

Modifiez la classe d'application existant

Pour application de basculer entre les vues, vous devez modifier la classe d'application en ajoutant des variables membres pour stocker les vues et une méthode pour les basculer.

Ajoutez le code suivant à la déclaration d' CMyWinApp dans MYWINAPP.H :

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

Les nouvelles variables membres, m_pOldView et m_pNewView, pointez vers l'affichage actuel et le nouvellement créée.La nouvelle méthode (SwitchView) bascule les vues une fois demandée par l'utilisateur.Le corps de la méthode est décrite plus loin dans cette rubrique dans Implémentez la fonction de basculement.

La dernière modification apportée à la classe d'application requiert en incluant un fichier d'en-tête qui définit un message windows (WM_INITIALUPDATE) utilisé dans la fonction de commutation.

Insérez la ligne suivante dans la section de bien comprendre MYWINAPP.CPP :

#include <AFXPRIV.H>

Enregistrez vos modifications et passez à l'étape suivante.

Créez et modifiez la classe d'affichage

Création de la classe d'affichage est rendu facile à l'aide de la commande de Nouvelle classe disponible dans l'Affichage de classes.La seule spécification de cette classe est qu'elle dérive d' CView.Ajoutez cette nouvelle classe à l'application.Pour des informations spécifiques sur ajouter une nouvelle classe au projet, consultez l' ajouter une classe.

Une fois que vous avez ajouté la classe au projet, vous devez modifier l'accessibilité de certains membres de classe d'affichage.

Modifiez NEWVIEW.H en modifiant le spécificateur d'accès d' protected à public pour le constructeur et le destructeur.Cela permet la classe à créer et être détruite dynamiquement et pour modifier l'apparence de vue avant qu'il soit visible.

Enregistrez vos modifications et passez à l'étape suivante.

Créez et placez la nouvelle vue

Pour créer et la nouvelle vue, vous devez modifier la fonction d' InitInstance de la classe d'application.La modification ajoute le nouveau code qui crée un objet de vue et de démarrer m_pOldView et m_pNewView avec les deux objets de vue existants.

Étant donné que la nouvelle vue est créée dans la fonction d' InitInstance , le nouveau et en existant de vues rendez persistantes pendant la durée de vie de l'application.Toutefois, l'application peut aussi bien créer la nouvelle vue dynamiquement.

Insérez ce code après l'appel à 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);

Enregistrez vos modifications et passez à l'étape suivante.

Implémentez la fonction de basculement

Dans l'étape précédente, vous avez ajouté le code qui a créé et est lancé un nouvel objet de vue.La dernière partie principale est d'implémenter la méthode de basculement, SwitchView.

À la fin de le fichier d'implémentation pour la classe d'application (MYWINAPP.CPP), ajoutez la définition de méthode suivante :

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

Enregistrez vos modifications et passez à l'étape suivante.

Ajoutez une prise en charge pour basculer la vue

La dernière étape consiste à ajouter du code qui appelle la méthode d' SwitchView lorsque l'application doit basculer entre les vues.Cette opération peut être effectuée de plusieurs façons : en ajoutant un élément de menu pour que l'utilisateur a choisi ou en basculant les vues en interne lorsque certaines conditions sont remplies.

Pour plus d'informations sur l'ajout de nouveaux éléments de menu et fonctions du gestionnaire de commandes, consultez Gestionnaires pour les commandes et les notifications de contrôle.

Voir aussi

Concepts

Architecture Document/Vue