我希望拆分成,2行2列的,
第一行:有2列
第2行:合并成一列

解决方案 »

  1.   

    转:《 窗体的任意分割》
      在VC中提供了一个类CSplitterWnd,它看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。
      在主框架创建客户区是先调用CSplitterWnd类的CreateStatic设定分割的行数和列数,然后用该类的CreateView函数创建一个一个的子窗口。代码如下:
    1.通过AppWizard创建单文档应用程序SplitWndDemo。
    2.通过向导另外生成3个CView类:CView1,CView2,CView3。加上程序原来的是CsplitWndDemoView,总共有4个视,对应了分割窗口的4个部分。
    3.在CMainFrame的头文件中加如下代码:
       CSplitterWnd m_wndsSplitter1;
       CSplitterWnd m_wndsSplitter2;
    4.重载CMainFrame的OnCreateClient()函数,分割窗口:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    //创建一个静态分栏窗口,分为三行一列 
        if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) 
          return FALSE;
        //将CSplitWndDemoView连接到0行0列窗格上
        m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CSplitWndDemoView),CSize(100,100), pContext); 
        m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); //将CView4连接到0行2列
        if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0))==NULL) 
          return FALSE; //将第1行0列再分开1行2列 
        //将CView2类连接到第二个分栏对象的0行0列
        m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); //将CView3类连接到第二个分栏对象的0行1列
        m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); 
        return TRUE; 
    // return CFrameWnd::OnCreateClient(lpcs, pContext);
    }
      

  2.   

    另有问题:
    上面的方法中,两个子窗口的大小是0,和设置的值不相符,
    请问CSplitterWnd的那个函数是设置子窗口大小的,
      

  3.   

    他的切分不符合你的要求:
    应该是这样的,BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    // TODO: Add your specialized code here and/or call the base class
        CRect rc;
        GetClientRect(&rc);    CSize PaneSize1(rc.Width()/2,rc.Height()/2);
        CSize PaneSize2(rc.Width(),rc.Height()/2);    if(m_wndSplitter1.CreateStatic(this,2,1)==NULL) 
          return FALSE;

        if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0, 0))==NULL) 
          return FALSE;     m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),PaneSize1,pContext); 
        m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),PaneSize1,pContext); 
        m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CView1),PaneSize2,pContext); 
        
        m_wndSplitter1.SetRowInfo(0,rc.Height()/2,10);
        m_wndSplitter1.SetRowInfo(1,rc.Height()/2,10);
        //m_wndSplitter2.SetColumnInfo(0, rc.Width()/2, 10);  默认就是一半,要不要无所谓!    m_wndSplitter1.RecalcLayout();
        m_wndSplitter2.RecalcLayout();    return TRUE; 

    }代码已测试过。
    =========================
    三个视图:CView1   CView2   CView3
    还有m_wndSplitter1  m_wndSplitter2