MFC中单文档窗口的拆分

时间:2022-12-15 21:30:33

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