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 CView
abgeleitete 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
CWinApp
abgeleiteten Objekts wirdCMyWinApp
deklariert undCMyWinApp
in MYWINAPP definiert. H und MYWINAPP. CPP.CNewView
ist der Name des neuenCView
abgeleiteten Objekts undCNewView
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.