Hinzufügen mehrerer Ansichten zu einem Dokument

In einer SDI-Anwendung (Single Document Interface), die mit der Microsoft Foundation Class (MFC)-Bibliothek erstellt wurde, wird jeder Dokumenttyp einem einzelnen Ansichtstyp zugeordnet. In einigen Fällen ist es wünschenswert, die aktuelle Ansicht eines Dokuments mit einer neuen Ansicht zu wechseln.

Tipp

Weitere Verfahren zum Implementieren mehrerer Ansichten für ein einzelnes Dokument finden Sie unter CDocument::AddView und das COLLECT MFC-Beispiel .

Sie können diese Funktionalität implementieren, indem Sie eine neue CViewabgeleitete Klasse und zusätzlichen Code zum dynamischen Wechseln der Ansichten zu einer vorhandenen MFC-Anwendung hinzufügen.

Die Schritte lauten wie folgt:

Bei der neu Standard der dieses Themas wird folgendes vorausgesetzt:

  • Der Name des CWinAppabgeleiteten Objekts wird CMyWinAppdeklariert und CMyWinApp in MYWINAPP definiert. H und MYWINAPP. CPP.

  • CNewView ist der Name des neuen CViewabgeleiteten Objekts und CNewView wird in NEWVIEW deklariert und definiert. H und NEWVIEW. CPP.

Ändern der vorhandenen Anwendungsklasse

Damit die Anwendung zwischen Ansichten wechseln kann, müssen Sie die Anwendungsklasse ändern, indem Sie Membervariablen hinzufügen, um die Ansichten und eine Methode zum Wechseln zu speichern.

Fügen Sie der Deklaration von CMyWinApp MYWINAPP den folgenden Code hinzu. H:

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

Die neuen Membervariablen m_pOldView und m_pNewView, zeigen auf die aktuelle Ansicht und die neu erstellte. Die neue Methode (SwitchView) wechselt die Ansichten, wenn sie vom Benutzer angefordert werden. Der Textkörper der Methode wird weiter unten in diesem Thema in der Implementierung der Schaltfunktion erläutert.

Für die letzte Änderung an der Anwendungsklasse ist eine neue Headerdatei erforderlich, die eine Windows-Nachricht (WM_INITIALUPDATE) definiert, die in der Umschaltfunktion verwendet wird.

Fügen Sie die folgende Zeile in den Include-Abschnitt von MYWINAPP ein. CPP:

#include <AFXPRIV.H>

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

Erstellen und Ändern der neuen Ansichtsklasse

Das Erstellen der neuen Ansichtsklasse wird mithilfe des Befehls "Neue Klasse " in der Klassenansicht vereinfacht. Die einzige Anforderung für diese Klasse ist, dass sie von CView. Fügen Sie diese neue Klasse zur Anwendung hinzu. Spezifische Informationen zum Hinzufügen einer neuen Klasse zum Projekt finden Sie unter Hinzufügen einer Klasse.

Nachdem Sie die Klasse dem Projekt hinzugefügt haben, müssen Sie die Barrierefreiheit einiger Ansichtsklassenmmber ändern.

ÄNDERN SIE NEWVIEW. H durch Ändern des Zugriffsbezeichners von protected zu public Konstruktor und Destruktor. Dadurch kann die Klasse dynamisch erstellt und zerstört werden und die Ansichtsdarstellung ändern, bevor sie sichtbar ist.

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

Erstellen und Anfügen der neuen Ansicht

Um die neue Ansicht zu erstellen und anzufügen, müssen Sie die InitInstance Funktion der Anwendungsklasse ändern. Die Änderung fügt neuen Code hinzu, der ein neues Ansichtsobjekt erstellt und dann sowohl als m_pNewView auch m_pOldView mit den beiden vorhandenen Ansichtsobjekten initialisiert.

Da die neue Ansicht innerhalb der InitInstance Funktion erstellt wird, bleiben sowohl die neuen als auch die vorhandenen Ansichten für die Lebensdauer der Anwendung erhalten. Die Anwendung kann jedoch genauso einfach die neue Ansicht dynamisch erstellen.

Fügen Sie diesen Code nach dem Aufruf von 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);

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

Implementieren der Umschaltfunktion

Im vorherigen Schritt haben Sie Code hinzugefügt, der ein neues Ansichtsobjekt erstellt und initialisiert hat. Der letzte Hauptteil besteht darin, die Schaltmethode zu implementieren. SwitchView

Am Ende der Implementierungsdatei für Ihre Anwendungsklasse (MYWINAPP). Fügen Sie die folgende Methodendefinition 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 Ihre Änderungen, und fahren Sie mit dem nächsten Schritt fort.

Hinzufügen der Unterstützung für das Wechseln der Ansicht

Der letzte Schritt umfasst das Hinzufügen von Code, der die SwitchView Methode aufruft, wenn die Anwendung zwischen Ansichten wechseln muss. Dies kann auf verschiedene Arten erfolgen: indem Sie entweder ein neues Menüelement hinzufügen, das der Benutzer auswählen oder die Ansichten intern wechseln kann, wenn bestimmte Bedingungen erfüllt sind.

Weitere Informationen zum Hinzufügen neuer Menüelemente und Befehlshandlerfunktionen finden Sie unter Handler für Befehle und Steuerelementbenachrichtigungen.

Siehe auch

Dokument-/Ansichtsarchitektur