最近在对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;2)创建5个CFormView类(通过对话框方式来创建):
CSplitterWnd m_wndSplitter2;
CSplitterWnd m_wndSplitter1;
CFormView11、CFormView12、CFormView13、CFormView14、CFormView15