Přidání více zobrazení do jednoho dokumentu
V aplikaci rozhraní jediného dokumentu (SDI), vytvořené pomocí knihovny Microsoft Foundation Class (MFC) je každý typ dokumentu přidružené zobrazení jednoho typu.V některých případech je žádoucí mít možnost přepínat v aktuálním zobrazení dokumentu nové zobrazení.
Tip
Další postupy provádění více zobrazení jednoho dokumentu naleznete v tématu CDocument::AddView a sběr vzorek knihovny MFC.
Tyto funkce lze implementovat přidáním nového CView-odvozenou třídu a doplňkový kód pro přepínání zobrazení dynamicky do existující aplikace knihovny MFC.
Tyto kroky jsou následující:
Změna existující třídy aplikace
Vytvořte a upravte zobrazení nové třídy
A vytvořte nové zobrazení.
Provádění funkce přepínání
Přidat podporu pro přepínání zobrazení
Zbývající část tohoto tématu se předpokládá následující:
Název CWinApp-odvozené objekt je CMyWinApp, a CMyWinApp je deklarována a definované v MYWINAPP.H a MYWINAPP.CPP.
CNewViewje název nové CView-odvozený objekt, a CNewView je deklarována a vymezuje pohled.H a pohled.CPP.
Změna existující třídy aplikace
Pro přepínání mezi různými zobrazeními aplikace musíte upravit třídu aplikace přidáním členské proměnné pro uložení zobrazení a metoda je zaměnit.
Přidejte následující kód k prohlášení o CMyWinApp v MYWINAPP.H:
CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );
Nové členské proměnné m_pOldView a m_pNewView, přejděte na příkaz aktuální zobrazení a nově vytvořený jeden.Nová metoda (SwitchView) přepne zobrazení, pokud uživatel požádá.Základní text metody je popsána dále v tomto tématu v implementovat funkci přepínání.
Poslední změny na třídu aplikace vyžaduje, včetně nové záhlaví souboru, který definuje zprávy systému Windows (WM_INITIALUPDATE) je používán spínací funkci.
Vložte následující řádek v oddílu zahrnout MYWINAPP.CPP:
#include <AFXPRIV.H>
Uložte provedené změny a pokračovat k dalšímu kroku.
Vytvořte a upravte zobrazení nové třídy
Vytvoření nové třídy zobrazení je tvořeno snadno Novou třídu příkaz k dispozici v zobrazení tříd.Jediným požadavkem pro tuto třídu je, že je odvozen od CView.Tato nová třída přidáte do aplikace.Konkrétní informace o přidání nové třídy do projektu, naleznete v Přidání třídy.
Po přidání třídy do projektu, je třeba změnit přístupnost některých členů třídy zobrazení.
Změňte pohled.H změnou specifikátor přístupu z protected k veřejné konstruktor a destruktor.To umožňuje třída vytvořena a dynamicky zničeny a změnit vzhled zobrazení, aby byl viditelný.
Uložte provedené změny a pokračovat k dalšímu kroku.
A vytvořte nové zobrazení.
A vytvořte nové zobrazení, je nutné změnit InitInstance funkce třídě aplikace.Změna přidá nový kód, který vytvoří nový objekt zobrazení a poté inicializuje obou m_pOldView a m_pNewView s dvěma existujícími objekty zobrazení.
Nové zobrazení je vytvořena v rámci InitInstance funkce, nové a existující zobrazení zachovat dobu života aplikace.Však aplikace stejným způsobem vytvořit nové zobrazení dynamicky.
Vložit tento kód po volání 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);
Uložte provedené změny a pokračovat k dalšímu kroku.
Provádění funkce přepínání
V předchozím kroku můžete přidat kód, který je vytvořen a inicializován nový objekt zobrazení.Poslední hlavní část je implementovat metodu spínací SwitchView.
Na konci souboru implementace třídy aplikace (MYWINAPP.CPP), přidejte následující definici metody:
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;
}
Uložte provedené změny a pokračovat k dalšímu kroku.
Přidat podporu pro přepínání zobrazení
Poslední krok vyžaduje přidání kódu, který volá SwitchView metoda, pokud aplikace potřebuje přepínat mezi jednotlivými zobrazeními.To lze provést několika způsoby: přidáním nové položky nabídky pro uživatele vybrat nebo přepínání zobrazení interně při splnění určitých podmínek.
Další informace o přidání nové položky nabídky a příkaz obslužné rutiny funkce, viz obslužné rutiny pro příkazy a ovládací prvek oznámení.