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 Anwendung des SDI (Single Document Interface) mit der Microsoft Foundation Class (MFC) erstellt wird, wird jeder Dokumenttyp einem bestimmten Ansichtstyp zugeordnet.In einigen Fällen ist es wünschenswert, die Möglichkeit haben, die aktuelle Ansicht eines Dokuments mit einer neuen Ansicht wechseln können.
Tipp |
|---|
Weitere Verfahren für das Implementieren von mehreren Ansichten eines einzelnen Dokument finden Sie unter CDocument::AddView und das Beispiel Sie SAMMELN MFC. |
Sie können diese Funktionalität implementieren, indem Sie eine neue CView abgeleitete Klasse und zusätzlichen Code für die Ansichten wechseln Sie zu einer vorhandenen MFC-Anwendung dynamisch hinzufügen.
Folgende Schritte werden ausgeführt:
Ändern Sie die vorhandene Anwendungsklasse
Erstellen und Ändern Sie die neue Ansichtsklasse
Erstellen und fügen Sie die neue Ansicht an
Implementieren Sie die Vermittlungsaufgabe
Fügen Sie Unterstützung für das Umschalten der Ansicht hinzu
Im weiteren Verlauf dieses Themas wird Folgendes angezeigt:
Der Name CWinApp abgeleitetes Objekt ist CMyWinApp, und CMyWinApp wird in MYWINAPP.H und MYWINAPP.CPP deklariert und definiert.
CNewView ist der Name neuen CView abgeleitetes Objekt und CNewView wird in NEWVIEW.H und NEWVIEW.CPP deklariert und definiert.
Ändern Sie die vorhandene Anwendungsklasse
Damit die Anwendung wechselt zwischen Ansichten, müssen Sie die Anwendungsklasse ändern, indem Sie die Membervariablen hinzu, um die Ansichten und eine 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 neuen Membervariablen, m_pOldView und m_pNewView, zeigen Sie auf aktuellen Ansicht und das neu erstellte.Die neue Methode (SwitchView) schaltet die Ansichten um, wenn sie 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 auch eine neue Headerdatei, die eine Windows-Meldung (WM_INITIALUPDATE) definiert die in der Vermittlungsaufgabe verwendet wird.
Fügen Sie die folgende Zeile im Abschnitt Einschließen 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 neue Ansichtsklasse
Das Erstellen der neuen Ansichtsklasse wird einfach durchgeführt, indem der Neue Klasse Befehl verwendet, der von der Klassenansicht verfügbar ist.Die einzige Anforderung für diese Klasse besteht darin, dass sie von CView berechnet.Fügen Sie die neue Klasse der Anwendung hinzu.Spezielle Informationen über das Hinzufügen einer neuen Klasse zum Projekt finden Sie Eine Klasse hinzufügen.
Nachdem Sie die Klasse zum Projekt hinzugefügt haben, müssen Sie die Barrierefreiheit Ansichtsklassen einiger Member ändern.
Ändern Sie NEWVIEW.H, indem Sie den Zugriffsspezifizierer von protected zu public für den Konstruktor und - destruktor ändern.Dadurch können die dynamisch erstellt und zerstört worden Klasse, und der Darstellung einer Ansicht zu ändern, bevor sie angezeigt wird.
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 anfügen, müssen Sie die InitInstance-Funktion der Anwendungsklasse ändern.Die Änderung fügt dem neuen Code hinzu, der ein neues Ansichtsobjekt erstellt und dann m_pOldView und m_pNewView mit den beiden vorhandenen Ansichtsobjekte initialisiert.
Da die neue Ansicht in der InitInstance, das die neue Funktion erstellt wird und die vorhandenen Ansichten umfassen während der Lebensdauer der Anwendung weiter.Allerdings kann die Anwendung als einfache Weise 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 fügen Sie Code hinzu, der ein neues Ansichtsobjekt erstellte und initialisierte.Das letzte wesentliche Teil ist, die Umschaltungs Methode SwitchView zu implementieren.
Am Ende der Implementierungsdatei der Anwendungsklasse (MYWINAPP.CPP), fügen Sie die Definition der folgenden 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 für das Umschalten der Ansicht hinzu
Der letzte Schritt umfasst das Hinzufügen von Code, der die SwitchView-Methode aufgerufen wird, wenn die Anwendung zwischen Ansichten wechseln muss.Dies kann auf verschiedene Arten erfolgen: entweder durch ein neues Menüelement hinzu, intern für den Benutzer oder die Ansichten wechseln ausgewählt, wenn bestimmte Anforderungen erfüllt sind.
Weitere Informationen zum Hinzufügen von neuen Menüelementen und Befehls handlerfunktionen finden Sie unter Handler für Befehle und Steuerelementbenachrichtigungen.
Tipp