Freigeben über


Hinzufügen mehrerer Ansichten zu einem Dokument

In einer Single Document Interface (SDI)- Anwendung, die mit der MFC-Bibliothek (Microsoft Foundation Class (MFC) erstellt wird, wird jeder Dokumenttyp mit einem einzelnen Ansichtstypen verwenden zugeordnet. In einigen Fällen ist es empfehlenswert, die Möglichkeit haben, die aktuelle Ansicht eines Dokuments mit einer neuen Ansicht zu wechseln.

Tipp

Weitere Verfahren zum Implementieren mehrerer Ansichten für einen einzelnen Dokument, finden Sie unter CDocument::AddView und im Beispiel COLLECT Sie MFC.

Diese Funktionalität können Sie implementieren, indem Sie neue CView abgeleitete Klasse und Code für die Ansichten zu einer bereits vorhandenen MFC-Anwendung dynamisch wechseln hinzufügen.

Folgende Schritte werden ausgeführt:

  • Ändern Sie die vorhandene Anwendungsklasse

  • Erstellen und Ändern Sie die Ansichtsklasse neue

  • Erstellen und fügen Sie die neue Ansicht an

  • Implementieren Sie die Vermittlungsaufgabe

  • Fügen Sie Unterstützung zum Umschalten der Ansicht hinzu

Der Rest dieses Themas gelangen Folgendes an:

  • Der Name CWinApp abgeleitetes Objekt ist CMyWinApp, und CMyWinApp ist in MYWINAPP.H und in MYWINAPP.CPP deklariert und definiert.

  • CNewView ist der Name neuen CView abgeleitetes Objekt und CNewView ist in NEWVIEW.H und in NEWVIEW.CPP deklariert und definiert.

Ändern Sie die vorhandene Anwendungsklasse

Damit die Anwendung wechselt zwischen Ansichten, müssen Sie die Anwendungsklasse ändern, indem Sie Membervariablen hinzu, um die Ansichten und einer Methode zu speichern, um sie zu wechseln.

Fügen Sie folgenden Code in die Deklaration von CMyWinApp in MYWINAPP.H hinzu:

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

Die neue Membervariablen, m_pOldView und m_pNewView, zeigen Sie die aktuelle Ansicht und das neu erstellte. Die neue Methode (SwitchView) wird die Ansichten um, wenn es vom Benutzer angefordert wird. Der Methodentext wird weiter unten in diesem Thema in Implementieren Sie die Vermittlungsaufgabe erläutert.

Die letzte Änderung der Anwendungsklasse erfordert einschließlich einer neuen Headerdatei, die eine Windows-Meldung (WM_INITIALUPDATE) definiert die in der Vermittlungsaufgabe verwendet wird.

Fügen Sie die folgende Zeile im Einschließungsabschnitt von MYWINAPP.CPP ein:

#include <AFXPRIV.H>

Speichern Sie die Änderungen und fahren Sie mit dem nächsten Schritt fort.

Erstellen und Ändern Sie die Ansichtsklasse neue

Das Erstellen der neuen Ansichtsklasse wird einfach gemacht, indem Neue Klasse den Befehl verwendet, der von der Klassenansicht verfügbar ist. Die einzige Anforderung für diese Klasse besteht darin, dass sie von CView abgeleitet. Fügen Sie die neue Klasse der Anwendung hinzu. Spezielle Informationen zum Hinzufügen einer neuen Klasse zum Projekt, finden Sie unter Hinzufügen einer Klasse.

Sobald Sie die Klasse zum Projekt hinzugefügt haben, müssen Sie den Zugriff von mehreren Ansichtsklassenmember ändern.

Ändern Sie NEWVIEW.H, indem Sie den Zugriffsspezifizierer von protected in public für Konstruktor und Destruktor ändern. Dies ermöglicht die dynamisch erstellt und zerstört wurden, Klasse, und der Ansichtsdarstellung zu ändern, bevor es sichtbar ist.

Speichern Sie die Änderungen und fahren Sie mit dem nächsten Schritt fort.

Erstellen und fügen Sie die neue Ansicht an

Um die neue Ansicht erstellen und anzufügen, müssen Sie die InitInstance-Funktion der Anwendungsklasse ändern. Die Änderung wird neuen Code hinzu, der ein neues Ansichtsobjekt erstellt und dann m_pOldView und m_pNewView mit den zwei vorhandenen Ansichtsobjekte initialisiert.

Da die neue Ansicht innerhalb der InitInstance-Funktion, das neue erstellt und vorhandene Ansichten bestehen während der Lebensdauer der Anwendung weiter. Es könnte die Anwendung so einfach die neue Ansicht gerade dynamisch erstellen.

Fügen Sie diesen Code nach dem Aufruf von ProcessShellCommand ein:

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

Speichern Sie die Änderungen und fahren Sie mit dem nächsten Schritt fort.

Implementieren Sie die Vermittlungsaufgabe

Im vorherigen Schritt haben Sie Code hinzu, der ein neues Ansichtsobjekt erstellte und initialisierte. Das letzte wichtige Schritt ist, die Umschaltungsmethode, SwitchView zu implementieren.

Am Ende der Implementierungsdatei der Anwendungsklasse (MYWINAPP.CPP), fügen Sie die Definition die folgende Methode hinzu:

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

Speichern Sie die Änderungen und fahren Sie mit dem nächsten Schritt fort.

Fügen Sie Unterstützung zum Umschalten der Ansicht hinzu

Der letzte Schritt umfasst, Code hinzufügen, der die SwitchView-Methode aufgerufen wird, wenn die Anwendung zwischen Ansichten wechseln muss. Dies kann auf mehrere Arten ausgeführt werden: entweder von einem neuen Menüelement, intern hinzufügen sodass der Benutzer oder die Ansichten umschalten auswählt, sobald bestimmte Anforderungen erfüllt werden.

Weitere Informationen zum Hinzufügen von neuen und Menüelementen von Befehlshandlerfunktionen, finden Sie unter Handler für Befehle und Verarbeiten.

Siehe auch

Konzepte

Dokument-/Ansichtsarchitektur