MFC單文檔中創建多視圖

基本步驟如下:

1.首先創建一個MFC單文檔應用程序。

2.添加4個MFC類TopLView、BottomLView、TopRView、BottomRView,基類爲CView。

3.添加一個MFC類CControlForm,基類爲CFormView,對話框ID默認。

4.創建一個切分類,如MySplitter,基類爲CSplitterWnd(默認基類選項中無此類,自己添加即可,也可以直接使用這個類)。

5.在框架類Cmainframe的頭文件中,添加2個MySplitter的變量(因爲下面要進行兩次切分操作)。

6.重寫框架類Cmainframe的OnCreateClient函數,如下:

 //第一次靜態切分CreateStatic,一行兩列

if (!m_wndSplitter.CreateStatic(this,1,2)) 

  return FALSE;

//第二次靜態切分(將第一次切分後的第二列再分爲2*2)及所有的子視圖創建(CreateView函數)。

 if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) ||
  !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1))||
  !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) || 
  !m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240),  pContext)) 
 { 
  m_wndSplitter.DestroyWindow(); 
  return FALSE; 
 }

// return CFrameWnd::OnCreateClient(lpcs, pContext);      //註釋掉原有的響應函數

注意:記得在Mainfrm.h中添加以上五個視圖類的頭文件:

#include "CControlForm.h"
#include "TopLView.h"
#include "TopRView.h"
#include "BottomLView.h"
#include "BottomRView.h"

6. 切分視圖完成,結果如下:

 如何在MFC單文檔中創建多視圖 - 老柯 - 菜鳥的朝聖之路

其中,最左的視圖爲FormView類型,操作類似對話框(可以在Resource-Dialog看到其對應的對話框資源);右邊四個的操作則類似普通視圖。

 

補充內容:

a. 此時創建的各個子視圖之間的分割條可以拖動,以改變視圖其大小。如果想固定分割條,則需要重載MySplitter類的鼠標響應函數。可以通過一個Bool型變量來控制是否可以拖動分割條:

 if (Isvisable)  //Isvisable在構造函數中已被初始爲FALSE
 {
  CSplitterWnd::OnLButtonDown(nFlags, point);
 }

b. 還可以通過重載MySplitter類的OnDrawSplitter函數來改變分割條的樣式。以下爲該函數代碼:

 #define LP RGB(128,128,128)
 #define RB RGB(192,192,192)

 //如果pDC 爲 NULL則僅使分割窗口區域無效
 if (pDC == NULL)
 {
  RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
  return;
 }
 ASSERT_VALID(pDC);

 CRect rc = rect;
 
 switch(nType) 
 { 
 case splitBorder:
  //重畫分割窗口邊界
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,RB,RB); 
  return; 
 case splitBox:
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1);
  pDC->FillSolidRect(rc,RGB(128,128,128)); 
  pDC->Draw3dRect(rc,RB,RB);
  return; 
 case splitBar: 
  //重畫分割條 
  pDC->FillSolidRect(rc,RGB(192,192,192));
  rc.InflateRect(-1,-1); 
  pDC->Draw3dRect(rc,RB,RB);  
  return; 
 default: 
  ASSERT(FALSE); 
 } 
 //填充中間的部分
 pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));

注:以上程序在vs2008上調試成功。

發佈了64 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章