Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 auf eine neue Ansicht umzuschalten.
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:
Im restlichen Teil dieses Themas wird Folgendes vorausgesetzt:
Der Name des
CWinApp-abgeleiteten Objekts istCMyWinApp, undCMyWinAppwird in MYWINAPP.H und MYWINAPP.CPP deklariert und definiert.CNewViewist der Name des neuenCView-abgeleiteten Objekts, undCNewViewwird in NEWVIEW.H und NEWVIEW.CPP deklariert und definiert.
Ä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 den folgenden Code hinzu:
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 Hauptteil der Methode wird weiter unten in diesem Thema in der Implementierung der Schaltfunktion diskutiert.
Die letzte Änderung an der Anwendungsklasse erfordert, dass eine neue Headerdatei enthalten ist, 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.CPP ein:
#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 an diese Klasse ist, dass sie von CView abgeleitet wird. 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.
Sobald Sie die Klasse zum Projekt hinzugefügt haben, müssen Sie die Zugriffsmöglichkeiten auf einige Member der View-Klasse ändern.
ÄNDERN SIE NEWVIEW.H, indem Sie den Zugriffsbezeichner von protected zu public für den Konstruktor und Destruktor ändern. 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 m_pOldView als auch m_pNewView 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 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 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 Ihrer Applikationsklasse (MYWINAPP.CPP) 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.