CMainFrame::OnCreateClient中使用两个CSplitterWnd变量完成窗口切分。m_wndSplitter先将客户区切分为两列,左右各占一半。然后再用m_wndSplitter_new将左边的一半切分为两行。至此,有1(左上),2(左下),3(右边)。遇到的问题是程序启动后,3号窗口没有占据一半区域  貌似占据了整个客户区,需要将m_wndSplitter控件向右拖动,左边的连个1,2号窗口才能显示出来。我的目的是程序启动后,就按照我设置的大小,1和2号各种四分之一,合起来占据客户区一半(左边),3号窗口占据客户区一半(右边)。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
if(!m_wndSplitter.CreateStatic(this, 1, 2))
{
return FALSE;
} CRect rect;
GetClientRect(&rect);
if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CStudentView), 
CSize(rect.Width() / 2, rect.Height()), pContext))
{
return FALSE;
} if (!(m_wndSplitter_new.CreateStatic(&m_wndSplitter,
2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 0))))
{
return FALSE;
} if(!m_wndSplitter_new.CreateView(0, 0, RUNTIME_CLASS(CTeacherView), 
CSize(rect.Width() / 2, rect.Height() / 2), pContext)
|| !m_wndSplitter_new.CreateView(1, 0, RUNTIME_CLASS(CContentView), 
CSize(rect.Width() / 2 , rect.Height() / 2), pContext))
{
return FALSE;
} return TRUE;
}

解决方案 »

  1.   

    响应主框架窗口WM_SIZE消息,在OnSize消息里利用CSplitterWnd::SetColumnInfo/SetRowInfo()来设置区域的大小,然后调用CSplitterWnd::RecalcLayout()来刷新,当然你在SetColumnInfo/SetRowInfo之前需要判断一下CSplitterWnd是否拆分完成。可以在CMainFrame类中定义个BOOL标记,初始值为FALSE,在OnCreateClient()函数中最后return TRUE;之前设置该标记值为TRUE。OnSize中判断该标记值,然后再调用上面提到的函数。
      

  2.   

    因为你没有显示设置列的信息,而系统采用了autosize,所以你的1、2几乎看不到,3占据了大部分区域。可以使用SetColumnInfo来调整你的列的宽度。
    例如m_wndSplitter.SetColumnInfo(0,330,10)
      

  3.   


    CSplitterWnd::SetColumnInfo
    CSplitterWnd::RecalcLayout