程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> MFC單文檔多視圖的靜態創建法

MFC單文檔多視圖的靜態創建法

編輯:關於C語言

  最近在做實驗室項目的時候需要在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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved