Sdílet prostřednictvím


Přidání více zobrazení do jediného dokumentu.

Každý typ dokumentu je v aplikaci rozhraní jediného dokumentu (SDI) vytvořené pomocí knihovny Microsoft Foundation Class (MFC) přidružené zobrazení jednoho typu.V některých případech je žádoucí mít možnost přepnout aktuální zobrazení dokumentu pomocí nového zobrazení.

Tip

Další postupy provádění více zobrazení jednoho dokumentu, viz CDocument::AddView a SHROMÁŽDĚNÍ vzorku MFC.

Tyto funkce lze implementovat přidáním nového CView-odvozené třídy a další kód přepnutí zobrazení dynamicky do existující aplikace MFC.

Kroky jsou následující:

  • Upravit existující třídy aplikace

  • Vytvořit a upravit nové třídy zobrazení

  • Vytvoření a připojení nového zobrazení

  • Provádění funkce přepínání

  • Přidání podpory pro přepínání zobrazení

Zbývající část tohoto tématu 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.

  • CNewViewnázev nového CView-odvozené objekt, a CNewView je deklarována a definována v nové zobrazení.H a pohled.CPP.

Upravit existující třídy aplikace

Přepínání mezi zobrazeními aplikace je třeba upravit třídu aplikace přidáním členské proměnné pro uložení zobrazení a metoda je přepnout.

Přidejte následující kód prohlášení o CMyWinApp v MYWINAPP.H:

CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );

Nové proměnné členů 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í na žádost uživatele.Základní text metody je popsána dále v tomto tématu v provádění funkce přepínání.

Poslední modifikace třídy 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.

V části zahrnout MYWINAPP vložte následující řádek.CPP:

#include <AFXPRIV.H>

Uložte změny a pokračovat dalším krokem.

Vytvořit a upravit nové třídy zobrazení

Vytvoření nové třídy zobrazení je snadné pomocí Novou třídu příkaz ze třídy zobrazení k dispozici.Jediným požadavkem u této třídy je pochází z CView.Přidáte nové třídy aplikace.Informace o přidání nové třídy do projektu naleznete Přidání třídy.

Po přidání třídy do projektu je třeba změnit dostupnost některé členy třídy zobrazení.

Změňte pohled.H změnou specifikátor přístupu z protected na veřejné pro konstruktor a destruktoru.To umožňuje třída vytvořena a dynamicky zničeny a změnit vzhled zobrazení dříve, než je viditelná.

Uložte změny a pokračovat dalším krokem.

Vytvoření a připojení nového zobrazení

Chcete-li vytvořit a připojit nové zobrazení, musíte upravit InitInstance funkce třídy aplikace.Změna přidá nový kód, který vytvoří nový objekt zobrazení a potom inicializuje i m_pOldView a m_pNewView s dvěma existující objekty zobrazení.

Nové zobrazení je vytvořena v rámci InitInstance zobrazení nové a stávající funkce, přetrvávají života aplikace.Aplikace však nelze stejně snadno vytvořit nové zobrazení dynamicky.

Vložit tento kód za 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 změny a pokračovat dalším krokem.

Provádění funkce přepínání

V předchozím kroku přidat kód, který je vytvořen a inicializován nového objektu zobrazení.Poslední hlavní část je implementace metody přepínání SwitchView.

Na konci souboru implementace aplikace třídy (MYWINAPP.CPP) přidejte následující definice 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 změny a pokračovat dalším krokem.

Přidání podpory pro přepínání zobrazení

Poslední krok vyžaduje přidání kód, který volá SwitchView metoda při přepínání mezi zobrazeními aplikace.To lze provést několika způsoby: přidání nové položky nabídky zvolte uživatele nebo interně přepínání zobrazení při splnění určitých podmínek.

Další informace o přidávání nové položky nabídky a funkce zpracování příkazu naleznete v obslužné rutiny pro příkazy a ovládání oznámení.

Viz také

Koncepty

Zobrazit dokument architektura