MFC中單文檔窗口的拆分

最近在對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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章