求助拆分窗口的问题之2!

时间:2022-05-04 19:21:10
我希望拆分成,2行2列的,
第一行:有2列
第2行:合并成一列

9 个解决方案

#1


那应该是先拆成上下两列,

再把上面的再拆分成左右!

没合并!

#2



 __1__|__2__
      3

呵...

#3


这样明白了吧。

#4


能给出详细代码吗?

#5


转:《 窗体的任意分割》
  在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);
}

#6


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

#7


他的切分不符合你的要求:
应该是这样的,

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

#8


十分感谢!

#9


up

#1


那应该是先拆成上下两列,

再把上面的再拆分成左右!

没合并!

#2



 __1__|__2__
      3

呵...

#3


这样明白了吧。

#4


能给出详细代码吗?

#5


转:《 窗体的任意分割》
  在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);
}

#6


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

#7


他的切分不符合你的要求:
应该是这样的,

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

#8


十分感谢!

#9


up