我在论坛里看了很多文章,关于视图窗口的切分,都是静态的方式,动态的没有.
我想要做得是,假如有个菜单,里面有三个菜单项,分别是:2个,4个,6个.如果点了菜单项之后,要求视图部分就响应切分成对应几个.请问怎么实现?

解决方案 »

  1.   

     1、关于CSplitterWnd类   
        我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割。   那么我们自己如何创建类似的界面,也实现窗口的任意的分割呢   ?在VC6.0中这就需要使用到CSplitterWnd类。CSplitterWnd看上去像是一种特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸。虽然VC6.0支持从AppWizard中创建分割窗口,但是自动加入的分割条总是不能让我们满意,因此我们还是通过手工增加代码来熟悉这个类。     
        
      CSplitterWnd的构造函数主要包括下面三个。     
      BOOL   Create(CWnd*   pParentWnd,int   nMaxRows,int   nMaxCols,SIZE   sizeMin,CCreateContext*   pContext,DWORD   dwStyle,UINT   nID);     
              功能描述:该函数用来创建动态切分窗口。   
              参数含义:pParentWnd   切分窗口的父框架窗口。   
              nMaxRows,nMaxCols是创建的最大的列数和行数。     
              sizeMin是窗格的现实大小。     
              pContext   大多数情况下传给父窗口。     
              nID是字窗口的ID号.     
        
      BOOL   CreateStatic(CWnd*   pParentWnd,int   nRows,int   nCols,DWORD   dwStyle,UINT   nID)     
          功能描述:用来创建切分窗口。     
          参数含义同上。     
        
      BOOL   CreateView   (int   row,int   col,CruntimeClass*   pViewClass,SIZE   sizeinit,CcreateContext*   pContext);     
          功能描述:为静态切分的窗口的网格填充视图。在将视图于切分窗口联系在一起的时候必   须先将切分窗口创建好。     
          参数含义:同上。   
        
      从CSplitterWnd源程序可以看出不管是使用动态创建Create还是使用静态创建CreateStatic,在函数中都调用了一个保护函数CreateCommon,从下面的CreateCommon函数中的关键代码可以看出创建CSplitterWnd的实质是创建了一系列的MDI子窗口。     
              DWORD   dwCreateStyle   =   dwStyle   &   ~(WS_HSCROLL|WS_VSCROLL);   
              if   (afxData.bWin4)     
                    dwCreateStyle   &=   ~WS_BORDER;   //   create   with   the   same   wnd-class   as   MDI-Frame   (no   erase   bkgnd)     
              if   (!CreateEx(0,   _afxWndMDIFrame,   NULL,   dwCreateStyle,   0,   0,   0,   0,pParentWnd->m_hWnd,   (HMENU)nID,   NULL))     
                  return   FALSE;   //   create   invisible     
        
      2、创建嵌套分割窗口     
          a、创建动态分割窗口   
          动态分割窗口使用Create方法。下面的代码将创建2x2的窗格。     
          m_wndSplitter.Create(this,2,2,CSize(100,100),pContext);     
          但是动态创建的分割窗口的窗格数目不能超过2x2,而且对于所有的窗格,都必须共享同一个视图,所受的限制也比较多,因此我们不将动态创建作为重点。我们的主要精力放在静态分割窗口的创建上。     
            
          b、创建静态分割窗口   
      与动态创建相比,静态创建的代码要简单许多,而且可以最多创建16x16的窗格。不同的窗格我们可以使用CreateView填充不同的视图。     
        
      举例:   
        
      在这里我们将创建CuteFtp的窗口分割。CuteFtp的分割情况如下:   
      +-------------------------+   
      |             CCuteFTPView               |   
      +-----------+-------------+     
      |                       |                           |   
      |       CView2     |     CView3           |         
      +-----------+-------------+   
      |           CView4                             |   
      +-------------------------+   
          创建步骤:     
          ▲   在创建之前我们必须先用AppWizard生成单文档CuteFTP,生成的视类为   CCuteFTPView.同时在增加三个视类或者从视类继承而来的派生类CView2,CView3   CView4.     
          ▲   增加成员:     
          在Cmainfrm.h中我们将增加下面的代码:     
          CSplitterWnd   wndSplitter1;   
          CSplitterWnd   wndSplitter2;   
          ▲   重载CMainFrame::OnCreateClient()函数:   
          BOOL   CMainFrame::OnCreateClient(   LPCREATESTRUCT   /*lpcs*/,   CCreateContext*   pContext)     
          {   //创建一个静态分栏窗口,分为三行一列     
              if(m_wndSplitter1.CreateStatic(this,3,1)==NULL)     
                  return   FALSE;   
              //将CCuteFTPView连接到0行0列窗格上   
              m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100),   pContext);     
              m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext);   //将CView4连接到0行2列   
              if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE,   m_wndSplitter.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;     
          }   
          
      

  2.   

    http://download.csdn.net/source/653222
      

  3.   

    首先,如果是csplitterwnd的动态拆分,那么最多只能是2,2的。就是2行2列。
      

  4.   

    SDI的情况就别考虑了。好像不行。MDI:
    BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
    {
    CMainFrame* pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    int nRows, nCols;
    switch (pMain->m_nSelect)
    {
    case 0:
    nRows = 1;
    nCols = 2;
    break;
    case 1:
    nRows = 2;
    nCols = 2;
    break;
    default:
    nRows = 2;
    nCols = 1;
    break;
    }
    return m_wndSplitter.Create( this,
      nRows, nCols,                 // TODO: adjust the number of rows, columns
    CSize( 10, 10 ),      // TODO: adjust the minimum pane size
      pContext );

    }nrows,ncols在menu的command设定.
      

  5.   

    有些监控软件里,对VIEW好象可以做任意的分割的.四个子窗口,9个子窗口等等.