Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I ett SDI-program (Single Document Interface) som skapats med MFC-biblioteket (Microsoft Foundation Class) associeras varje dokumenttyp med en enda vytyp. I vissa fall är det önskvärt att kunna växla den aktuella vyn för ett dokument med en ny vy.
Tips/Råd
Ytterligare procedurer för att implementera flera vyer för ett enda dokument finns i CDocument::AddView och COLLECT MFC-exemplet.
Du kan implementera den här funktionen genom att lägga till en ny CView-härledd klass och ytterligare kod för att växla vyer dynamiskt till ett befintligt MFC-program.
Stegen är följande:
Resten av det här avsnittet förutsätter följande:
Namnet på det
CWinApp-härledda objektet ärCMyWinApp, ochCMyWinAppdeklareras och definieras i MYWINAPP.H och MYWINAPP.CPP.CNewViewär namnet på det nyaCView-härledda objektet ochCNewViewdeklareras och definieras i NEWVIEW. H och NEWVIEW. CPP.
Ändra den befintliga programklassen
För att programmet ska växla mellan vyer måste du ändra programklassen genom att lägga till medlemsvariabler för att lagra vyerna och en metod för att växla dem.
Lägg till följande kod i deklarationen i CMyWinAppMYWINAPP. H:
CView *m_pOldView;
CView *m_pNewView;
CView *SwitchView();
De nya medlemsvariablerna m_pOldView och m_pNewView, pekar på den aktuella vyn och den nyligen skapade. Den nya metoden (SwitchView) växlar vyerna när användaren begär det. Brödtexten för metoden beskrivs senare i det här avsnittet i Implementera växlingsfunktionen.
Den senaste ändringen av programklassen kräver att du inkluderar en ny rubrikfil som definierar ett Windows-meddelande (WM_INITIALUPDATE) som används i växlingsfunktionen.
Infoga följande rad i inkluderingsavsnittet i MYWINAPP. CPP:
#include <AFXPRIV.H>
Spara ändringarna och fortsätt till nästa steg.
Skapa och ändra den nya vyklassen
Det är enkelt att skapa den nya vyklassen med hjälp av kommandot Ny klass som är tillgängligt från klassvyn. Det enda kravet för den här klassen är att den härleds från CView. Lägg till den här nya klassen i programmet. Specifik information om hur du lägger till en ny klass i projektet finns i Lägga till en klass.
När du har lagt till klassen i projektet måste du ändra tillgängligheten för vissa medlemmar i visningsklassen.
Ändra NEWVIEW. H genom att ändra åtkomstspecificeraren från protected till public för konstruktorn och destruktorn. På så sätt kan klassen skapas och förstöras dynamiskt och ändra visningsutseendet innan den visas.
Spara ändringarna och fortsätt till nästa steg.
Skapa och bifoga den nya vyn
Om du vill skapa och bifoga den nya vyn måste du ändra funktionen för InitInstance din programklass. Ändringen lägger till ny kod som skapar ett nytt visningsobjekt och initierar sedan både m_pOldView och m_pNewView med de två befintliga vyobjekten.
Eftersom den nya vyn skapas i InitInstance funktionen bevaras både de nya och befintliga vyerna under programmets livslängd. Programmet kan dock lika enkelt skapa den nya vyn dynamiskt.
Infoga den här koden efter anropet till 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);
Spara ändringarna och fortsätt till nästa steg.
Implementera växlingsfunktionen
I föregående steg lade du till kod som skapade och initierade ett nytt visningsobjekt. Den sista huvuddelen är att implementera växlingsmetoden , SwitchView.
I slutet av implementeringsfilen för din programklass (MYWINAPP. CPP) lägger du till följande metoddefinition:
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;
}
Spara ändringarna och fortsätt till nästa steg.
Lägg till stöd för att växla vyn
Det sista steget omfattar att lägga till kod som anropar SwitchView metoden när programmet behöver växla mellan vyer. Detta kan göras på flera sätt: genom att antingen lägga till ett nytt menyalternativ som användaren kan välja eller byta vyer internt när vissa villkor uppfylls.
Mer information om hur du lägger till nya menyalternativ och kommandohanterarfunktioner finns i Hanterare för kommandon och kontrollmeddelanden.