最近在對MFC中單文檔拆分的時候遇到了點問題,在網上有很多大量的資料,但是發現都是將單文檔進行簡單的拆分,比如拆分爲:1行2列,2行1列,這樣比較簡單的拆分,比較容易實現,下面我將介紹先對一個單文檔的拆分,拆分效果如圖所示:
1、MFC主要支持兩種類型的拆分:靜態拆分和動態拆分。
靜態拆分:靜態拆分窗口的行列數在拆分窗口被創建時就設置好了,用戶不能更改。但是用戶可以縮放各行各列。一個靜態拆分窗口最多可以包含16行16列。
動態拆分:動態拆分窗口最多可以有兩行兩列,但它們可以相互拆分和合並。
2、靜態拆分的過程:
靜態拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create創建,並且由於MFC不會自動創建靜態拆分窗口中顯示的視圖,所以您要親自在CreateStatic返回之後創建視圖。CsplitterWnd爲此提供了名爲 CreateView的函數。
1). 在父框架中嵌入一個CSplitterWnd成員變量。
2). 重載父框架的CFrameWnd::OnCreateClient成員函數。
3). 從重載的OnCreateClient函數中調用類CSplitterWnd的Create或CreateStatic成員函數,並調用CreateView來創建視圖。
3、關鍵函數介紹:
BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST ); 函數有5個參數,意義如下: ● pParentWnd:切分窗口的父窗口指針 ● nRows:水平方向分隔窗口的數目 ● nCols:垂直方向分隔窗口的數目 ● dwStyle:切分窗口的風格 ● nID:子窗口的ID值,默認爲系統定義的AFX_IDW_PANE_FIRST 返回值:如果創建成功,返回非零值(TRUE),否則返回0(FALSE)。 m_wndSplitter.CreateStatic(this, 2,1); // 切分爲2行1列
virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass,
SIZE sizeInit, CCreateContext* pContext ); 函數有5個參數,意義如下: ● row:窗格的行標,從0開始 ● col:窗格的列標,從0開始 ● pViewClass:視圖的執行期類CRuntimeClass指針,可以用宏RUNTIME_CLASS獲得 ● sizeInit:一個SIZE(或者CSize)類型的數據,指定窗格的初始大小 ● pContext:一般是由父窗口傳遞過來,包含窗口的創建信息 返回值:如果創建成功,返回非零值(TRUE),否則返回0(FALSE)。
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),CSize(190,100),pContext)4、代碼實現:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
//首先將窗口拆分成2行1列
if(!m_wndSplitter1.CreateStatic(this,2,1))
{
return false;
}
//再將第一行拆分成1行3列
if(!m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,3,WS_CHILD|WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,0)))
{
return false;
}
//再將第3列分成2行1列
if(!m_wndSplitter3.CreateStatic(&m_wndSplitter2,2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter2.IdFromRowCol(0,2)))
{
return false;
}
//獲得屏幕的高度和寬度
int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);
//接下來創建窗口
if(!m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CFormView11),CSize(0,0),pContext))
{
return false;
}
//設置高度
m_wndSplitter1.SetRowInfo(0,height/4*3,1);
if(!m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CFormView12),CSize(0,0),pContext)
|| !m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CFormView13),CSize(0,0),pContext))
{
return false;
}
//設置寬度
m_wndSplitter2.SetColumnInfo(0,width/10,1);
m_wndSplitter2.SetColumnInfo(1,width/10*6.5,1);
if(!m_wndSplitter3.CreateView(0,0,RUNTIME_CLASS(CFormView14),CSize(0,0),pContext)
|| !m_wndSplitter3.CreateView(1,0,RUNTIME_CLASS(CFormView15),CSize(0,0),pContext))
{
return false;
}
//設置高度
m_wndSplitter3.SetRowInfo(0,(height/4*3)/2,1);
return true;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
其中需要設置的參數:
1)CMainFrame類中添加三個CSplitterWnd類的對象:
CSplitterWnd m_wndSplitter3;
CSplitterWnd m_wndSplitter2;
CSplitterWnd m_wndSplitter1;
2)創建5個CFormView類(通過對話框方式來創建):
CFormView11、CFormView12、CFormView13、CFormView14、CFormView15