Udostępnij za pośrednictwem


Dodawanie wielu widoków do jednolitego dokumentu

W aplikacji interfejsu (SDI) utworzone za pomocą biblioteki Microsoft Foundation klasy (MFC) każdy typ dokumentu jest skojarzony z typem widoku pojedynczego.W niektórych przypadkach jest pożądane mają możliwość przełączenia widoku bieżącego dokumentu z nowego widoku.

PoradaPorada

Dodatkowe procedury wdrażania wielu widoków dla pojedynczego dokumentu, zobacz CDocument::AddView i zbierania próbki MFC.

Można zaimplementować tę funkcję, dodając nowe CView-klasa oraz dodatkowy kod przełączania widoków dynamicznie do istniejącej aplikacji MFC.

Dostępne są następujące kroki:

  • Modyfikować istniejące klasy aplikacji

  • Tworzenie i modyfikowanie klasy nowego widoku

  • Utwórz i Dołącz nowy widok

  • Implementować funkcji przełączania

  • Dodawanie obsługi przełączania widoku

Pozostałej części tego tematu założono następujące czynności:

  • Nazwa CWinApp-pochodnych obiekt jest CMyWinApp, i CMyWinApp jest zadeklarowana i określone w MYWINAPP.H i MYWINAPP.CPP.

  • CNewViewjest nazwą nowego CView-pochodzące z obiektu, i CNewView jest zadeklarowana i zdefiniowane w nowy widok.H i nowy widok.CPP.

Modyfikować istniejące klasy aplikacji

Dla aplikacji przełączyć się między widokami trzeba zmodyfikować klasy aplikacji przez dodawanie zmiennych do przechowywania poglądy i metoda je zmieniać.

Dodaj następujący kod do deklaracji CMyWinApp w MYWINAPP.H:

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

Nowe zmienne składowe, m_pOldView i m_pNewView, wskaż polecenie Widok bieżący i jednej nowo utworzonej.Nowe metody (SwitchView) przełącza widoki na żądanie użytkownika.Treść metody opisanej w dalszej części tego tematu w zaimplementować funkcję przełączania.

Ostatnia modyfikacja do klasy aplikacji wymaga, łącznie z nowego pliku nagłówka, który definiuje komunikatu systemu Windows (WM_INITIALUPDATE), używany w funkcji przełączania.

Wstaw następujący wiersz w sekcji Dołącz MYWINAPP.CPP:

#include <AFXPRIV.H>

Zapisz zmiany i przejdź do następnego kroku.

Tworzenie i modyfikowanie klasy nowego widoku

Tworzenie nowej klasy widoku jest łatwe za pomocą Nową klasę polecenia dostępne w widoku klasy.Jedynym wymaganiem dla tej klasy jest, że pochodzi on z CView.Dodawanie tej nowej klasy do aplikacji.Aby uzyskać szczegółowe informacje na temat dodawania nowej klasy do projektu, zobacz Dodawanie klasy.

Po dodaniu klasy do projektu, należy zmienić dostępność niektórych członków klasy widoku.

Zmodyfikuj nowy widok.H zmieniając specyfikatora dostępu z protected do publicznych dla konstruktora i destruktora.Dzięki temu klasy, aby być tworzone i niszczone dynamicznie zmodyfikować wygląd widoku, przed udostępnieniem.

Zapisz zmiany i przejdź do następnego kroku.

Utwórz i Dołącz nowy widok

Aby utworzyć i dołączyć nowy widok, należy zmodyfikować InitInstance funkcji aplikacji klasy.Modyfikacja dodaje nowy kod, który tworzy nowy obiekt widoku i następnie inicjuje zarówno m_pOldView i m_pNewView z dwóch istniejących obiektów widoku.

Ponieważ nowy widok jest tworzony w InitInstance funkcji widoki nowych i istniejących utrzymują się istnienia aplikacji.Jednak aplikacja może równie łatwo utworzyć nowy widok dynamicznie.

Wstaw ten kod po wywołaniu 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);

Zapisz zmiany i przejdź do następnego kroku.

Implementować funkcji przełączania

W poprzednim kroku dodawane jest tworzony i inicjowany nowy obiekt w widoku Kod.Ostatni fragment głównych jest wdrożenie przełączającego metoda SwitchView.

Na końcu pliku implementacji aplikacji klasy (MYWINAPP.CPP), dodaj następującą definicję 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;
} 

Zapisz zmiany i przejdź do następnego kroku.

Dodawanie obsługi przełączania widoku

Ostatnim krokiem obejmuje dodawanie kodu, który wywołuje SwitchView w czasie, gdy aplikacja wymaga przełączać się między widokami.Można to zrobić na kilka sposobów: przez dodanie nowego elementu menu dla użytkownika wybrać lub przełączania widoków wewnętrznie, po spełnieniu pewnych warunków.

Aby uzyskać więcej informacji na temat dodawania nowych elementów menu i funkcje obsługi polecenia, zobacz obsługi dla poleceń i kontroli.

Zobacz też

Koncepcje

Widok dokumentu/Architecture