网上其他大牛已经对MFC窗口分割进行了详细介绍,这里主要用意是分享我在做窗口分割的经验,若是对大家能够有所帮助的话,我倍感荣幸,由于本人水平有限,如若本文中出现错误,望大家见谅与指正!
MFC窗口分割的作案工具主要是CSplitterWnd类成员函数CreateStatic()与CreateView(),CreateStatic()函数用于分割窗口,可以利用返回值判断分割是否成功;CreateView()函数用于关联相关的视图类。两个函数的原型为:
virtual BOOL CreateStatic(
CWnd* pParentWnd,
int nRows,
int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);
pParentWnd:父窗口指针,第一次分割指定为this;nRows:分割出来窗口的行数;nCols:分割出来窗口的列数;dwStyle:分割窗口的属性;nID:对于需要再次分割窗口的ID;
virtual BOOL CreateView(
int row,
int col,
CRuntimeClass* pViewClass,
SIZE sizeInit,
CCreateContext* pContext
);
row:需要关联视图类的行索引(
以0开始);col:需要关联视图类的列索引(
以0开始);pViewClass:一般通过宏定义的“函数”RUNTIME_CLASS()得到需要关联的视图运行之间类;sizeInit:子窗口的尺寸;pContext:填写OnCreateClient()函数传递进来的环境参数。
CSplitterWnd m_splitwnd;
CSplitterWnd m_subsplitwnd;
对于需要关联的View类可以在CMainFrame头文件类定义中添加相关的声明,添加的同时要添加相关类的头文件,方便进行管理。
CsplitwindView* m_psplitwnd;
CDialogView* m_pdialogview;
CDialogSub* m_pdialogsub;
注明:在调试的时候可能会出现如下的错误,需要在相关View类头文件中添加XXXdoc.h,View类xxxdoc.h要在xxxView.h前面。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rect;
GetClientRect(&rect);
int nwidth(rect.right);
int nheight(rect.bottom); //获取客户区窗口大小
if (!m_splitwnd.CreateStatic(this, 1, 2)) //窗口分割
{
MessageBox(_T("分割窗口错误"), _T("Error"), MB_OK|MB_ICONERROR);
return false;
}
//关联相关的View类
m_splitwnd.CreateView(0, 0, RUNTIME_CLASS(CsplitwindView), CSize(nwidth/6*3, nheight), pContext);
m_psplitwnd = (CsplitwindView*)m_splitwnd.GetPane(0, 0);
//对子窗口进行在分割
if (!m_subsplitwnd.CreateStatic(&m_splitwnd, 2, 1, WS_VISIBLE|WS_CHILD, m_splitwnd.IdFromRowCol(0,1)))
{
MessageBox(_T("子窗口分割窗口错误"), _T("Error"), MB_OK | MB_ICONERROR);
return false;
}
//关联相关的View类
m_subsplitwnd.CreateView(0, 0, RUNTIME_CLASS(CDialogView), CSize(nwidth/6*3, nheight/2), pContext);
m_pdialogview = (CDialogView*)m_subsplitwnd.GetPane(0, 0);
m_subsplitwnd.CreateView(1, 0, RUNTIME_CLASS(CDialogSub), CSize(nwidth/6*3, nheight/2), pContext);
m_pdialogsub = (CDialogSub*)m_subsplitwnd.GetPane(1, 0);
m_splitwnd.SetActivePane(0, 0);
return true;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
上面第二次调用CreateStaic()函数是对子窗口的第二次分割,上面关联的CsplitwindView为工程向导创建的,CDialogView与CdialogSub是相关的对话框类,他们的创建步骤为:1.创建相关的对话框资源;2.对话框的属性Style选择为child,border属性选择为none,否则会报错;3.添加对话框类将其派生自CFormView类。