基本步驟如下:
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. 切分視圖完成,結果如下:
其中,最左的視圖爲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上調試成功。