growing for better and beter
日历
网志分类
· 所有网志 (123)
· c/c++学习 (38)
· 休闲生活指南 (1)
· 专业基础 (5)
· 非专业积累 (47)
· 青年励志篇 (9)
· 生活万花筒 (10)
· 个人原创 (3)
· 职业生涯 (6)
· 未分类 (4)
最新的评论
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 图形图像--源码下载
· 萝卜的matlab
· 小鸟的博客---拉出去喂鸟
· 实验室mm
· 半月弯
· 最爱青橙
· http://sincerewfeng.spaces.live.com/

订阅 RSS

0011419

歪酷博客

沿路,熟,
黎明的歌者 @ 2007-05-08 09:08

使用VC6.0实现窗口的任意分割    
   
   
  一、关于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.1创建动态分割窗口    
    动态分割窗口使用Create方法。下面的代码将创建2x2的窗格。    
    m_wndSplitter.Create(this,2,2,CSize(100,100),pContext);    
    但是动态创建的分割窗口的窗格数目不能超过2x2,而且对于所有的窗格,都必须共享同一个视图,所受的限制也比较多,因此我们不将动态创建作为重点。我们的主要精力放在静态分割窗口的创建上。    
    2.2创建静态分割窗口    
  与动态创建相比,静态创建的代码要简单许多,而且可以最多创建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;    
    }