Sdílet prostřednictvím


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í.

Viz také

Koncepty

Architektonický model dokument/zobrazení