<转>MFC动态分割窗口

转抄如下:
===============================================================

作者:南京邮政局计算机中心   张中庆

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;  
    }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值