如上图,分两步:
1、分割成一行两列的窗口,左边树视图,右边比较特殊,是一个CFrameWnd派生类的框架。窗口分割在主框架的视图类中进行,注意不在主框架的OnCreateClient中分割。
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_split.CreateStatic(this,1,2)) return FALSE;
CCreateContext *pContext = (CCreateContext *)lpCreateStruct->lpCreateParams;
if(!m_split.CreateView(0,0,RUNTIME_CLASS(CLeftView),CSize(500,0),pContext))
{
m_split.DestroyWindow();
return 0;
}
//第一列设置了大小,第二列默认使用剩下的大小
if(!m_split.CreateView(0,1,RUNTIME_CLASS(CMyFrameWnd),CSize(0,0),pContext))
{
m_split.DestroyWindow();
return 0;
}
return 1;
}
void CChildView::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
int width = cx/4;
m_split.MoveWindow(0, 0, cx, cy);
m_split.SetColumnInfo(0, width, 0);
m_split.SetColumnInfo(1, cx-width, 0);
m_split.RecalcLayout();
}
第二部:将右边的视图再次分割成两行一列的视图。在CFrameWnd的派生类CMyFrameWnd的OnCreateClient函数中进行分割:
BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if(!m_split.CreateStatic(this,2,1)) return FALSE;
if(!m_split.CreateView(0,0,RUNTIME_CLASS(CRightView),CSize(0,300),pContext))
{
m_split.DestroyWindow();
return FALSE;
}
//第一行设置了大小,第二行默认使用剩下的大小
if(!m_split.CreateView(1,0,RUNTIME_CLASS(CBottomView),CSize(0,0),pContext))
{
m_split.DestroyWindow();
return FALSE;
}
return TRUE;
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}