最近在做實驗室項目的時候需要在MFC下生成單文檔多視圖的結構,經過網上幾個小時的尋找以及查書終於找到了一種可行的同時又較好理解的解法,記錄下來:
首先,由於是靜態創建,所以肯定是先初始化好想創建的視圖啦。注意,我所有的操作都在**App類中做。
1 private:
2 CView* m_pView[4];
我在App類中聲明了一個視圖數組,並在InitInstance中初始化它,還包括視圖的創建等。
視圖類初始化
1 CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
2 m_pView[0] = m_pActiveView; //由於一開始顯示的就是m_pView[0]所以直接賦給它
3 m_pView[1] = new CProductionFormView;
4 m_pView[2] = new CEventsListView;
5 m_pView[3] = new CRunningFormView;
6 //初始化上下文,主要是文檔指針,並創建其余視圖
7 CCreateContext context;
8 context.m_pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
9 m_pView[1]->Create(NULL,NULL,(AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE),CFrameWnd::rectDefault,m_pMainWnd,AFX_IDW_PANE_FIRST+1,&context);
10 m_pView[2]->Create(NULL,NULL,(AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE),CFrameWnd::rectDefault,m_pMainWnd,AFX_IDW_PANE_FIRST+2,&context);
11 m_pView[3]->Create(NULL,NULL,(AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE),CFrameWnd::rectDefault,m_pMainWnd,AFX_IDW_PANE_FIRST+3,&context);
12 //需要我們人工調用更新函數
13 for(int i=0; i < 4; i++)
14 m_pView[i]->OnInitialUpdate();
我在菜單中加入Command消息響應視圖的切換,整個切換在SwitchView函數中完成,其定義如下:
SwitchView
1 void CCardSystemApp::SwithToView(int nView)
2 {
3 ASSERT(nView>=0 && nView <=4);
4 CView* pOldActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
5 CView* pNewActiveView = m_pView[nView];
6 ASSERT(pNewActiveView);
7 if(pNewActiveView == pOldActiveView)
8 return;
9
10 // 交換視圖的窗口ID,使RecalcLayout()可以工作
11 UINT temp = ::GetWindowLong(pOldActiveView->m_hWnd,GWL_ID);
12 ::SetWindowLong(pOldActiveView->m_hWnd,GWL_ID,::GetWindowLong(pNewActiveView->m_hWnd,GWL_ID));
13 ::SetWindowLong(pNewActiveView->m_hWnd,GWL_ID,temp);
14
15 pOldActiveView->ShowWindow(SW_HIDE);
16 pNewActiveView->ShowWindow(SW_SHOW);
17
18 ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewActiveView);
19 ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
20 pNewActiveView->Invalidate();
21
22 }