上一节中鸡啄米讲了文档、视图和框架构制中各对象之间的关系,本节浸要讲讲正正在MFC中怎样分割窗口。

      分割窗口概述

       分割窗口,顾名思义,就是将一个窗口分割成众个窗格,正正在每个窗格中都包含有视图,或者是同相同板的视图,或者是折柳样板的视图。

        MFC分割窗口的格事务署有两种,动态分割和静态分割。

       动态分割窗口通常用于创建同一个文档对应的众个视图,而且这些视图一般都是同相同板的视图,可以正正在用户编辑文档的折柳限准时提供便当。

        大家看下Word里的动态分割窗口就很明白了,以Word 2007文档为例,正正在菜单中点击“视图”->“拆分”,就可以看到一条随鼠标移动的离开条,当银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站正正在文档中某个位置按下鼠标左键时,分割条就固定了下来,天生了上下两个分割窗格,通过滚动每个窗格中的笔直滚动条可以看到,两个窗格中的实质相同,这就是所说的对应同一个文档的同一类视图。

        动态分割窗口最众可以有两行两列。

        静态分割窗口比拟常睹。银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站经常能看到某个软件打开后,界面窗口默认被分割成了几个窗格,这就是静态分割窗口。

       静态分割窗口斧正正在窗口创建时,分割的窗格就曾经天生了,而且用户不行改变窗格的数量和善序。静态分割窗口最众支持16行16列。通常静态分割窗口的每个窗格中包含折柳类的视图,当然也可以是同一类的视图。

       CSplitterWnd类

       MFC中的分割窗口类-CSplitterWnd类提供了分割窗口的功能。CSplitterWnd类中包含一个分割器窗口,该分割器窗口就是一个包含众个窗格的窗口。银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站分割窗口时就是直接正正在此分割器窗口中分割的。

       鸡啄米下面先容三个最常用的成员函数:

C++代码
  1. virtual BOOL Create(   
  2.    CWnd* pParentWnd,   
  3.    int nMaxRows,   
  4.    int nMaxCols,   
  5.    SIZE sizeMin,   
  6.    CCreateContext* pContext,   
  7.    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,   
  8.    UINT nID = AFX_IDW_PANE_FIRST    
  9. );  

       创建动态分割窗口。参数pParentWnd为分割器窗口的父框架窗口;参数nMaxRows为分割器窗口的最大行数,不行越过2;参数nMaxCols为分割器窗口的最大列数,也不行越过2;参数sizeMin为窗格能显现的最小尺寸,如果窗格尺寸小于sizeMin则不显现;参数pContext为指向CCreateContext构制的指针,大普及情况下可以赋值为父框架窗口的pContext;参数dwStyle指定窗口风格;参数nID为分割窗口的ID,除非分割器窗口嵌入到另一个分割器窗口中,不然可以取值AFX_IDW_PANE_FIRST。

C++代码
  1. virtual BOOL CreateStatic(   
  2.    CWnd* pParentWnd,   
  3.    int nRows,   
  4.    int nCols,   
  5.    DWORD dwStyle = WS_CHILD | WS_VISIBLE,   
  6.    UINT nID = AFX_IDW_PANE_FIRST    
  7. );  

       创建静态分割窗口。参数pParentWnd、dwStyle和nID同上;参数nRows为行数,不行越过16;参数nCols为列数,同样不行越过16。

C++代码
  1. virtual BOOL CreateView(   
  2.    int row,   
  3.    int col,   
  4.    CRuntimeClass* pViewClass,   
  5.    SIZE sizeInit,   
  6.    CCreateContext* pContext    
  7. );  

       为静态分割窗口创建窗格视图。参数row指定分割器窗口中陈设新视图的行;参数col指定陈设新视图的列;参数pViewClass指定新视图的CRuntimeClass对象;参数sizeInit指定新视图的初始大小;参数pContext为指向CCreateContext构制的指针,通常可以赋值为传递给父框架窗口的浸载函数CFrameWnd::OnCreateClient的pContext参数值。

       动态分割窗口

        创建动态分割窗口的步骤为:

       1. 正正在父框架类中定义一个CSplitterWnd样板的成员对象。

        2. 浸载父框架类的CFrameWnd::OnCreateClient成员函数。

       3. 正正在浸载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。

       下面鸡啄米给大家一个实例。同样以VS2010/MFC编程初学之三十四(菜单:VS2010菜单资源详解)中创建Example34工程为例,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站要实现正正在主框架窗口的客户区中创建两行两列的动态分割窗口。以下是创建动态分割窗口的举座步骤:

        1. 正正在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

       2. 正正在Class View类视图中找到CMainFrame类,右键点击,正正在右键菜单中选择Properties,就会显现属性页,然后正正在属性页的东西栏上点击Tip为Overrides的按钮,下面的列表中就列出了可以浸载的函数,找到OnCreateClient天生浸载函数。

       3. 正正在MainFrm.cpp文件中找到刚浸载的OnCreateClient函数修改如下:

C++代码
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
  2. {   
  3.  // TODO: Add your specialized code here and/or call the base class   
  4.  // 创建动态分割窗口,两行两列   
  5.  return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext);   
  6.   
  7.  //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
  8. }  

       4. 正正在Resource View资源视图中,打开Menu下的IDR_MAINFRAME菜单,正正在View下添加一个菜单项,Caption设为Splitter Window,ID设为(一定要设为)ID_WINDOW_SPLIT。这样正正在运行结果界面中点击此菜单项时MFC会执行一些操作显现动态分割窗口。

       5. 运行程序,点击菜单中的View->Splitter Window菜单项,创建动态分割窗口后效果如下:

 动态分割窗口

       静态分割窗口

        创建静态分割窗口的步骤为:

        1. 正正在父框架类中定义一个CSplitterWnd样板的成员对象。

       2. 浸载父框架类的CFrameWnd::OnCreateClient成员函数。

       3. 正正在浸载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,然后可以调用CSplitterWnd成员对象的CreateView成员函数为每个窗格创建视图。 

        鸡啄米仍通过Example34工程给大家一个实例,目的是正正在主框架窗口中的客户区创建一个两行一列的静态分割窗口。如果曾经试验过动态分割窗口的创建,那么郁闷撤销那些修改吧。创建静态分割窗口的举座步骤如下:

        1. 正正在MainFrm.h文件中为CMainFrame类添加成员对象:CSplitterWnd m_wndSplitter;。

        2. 正正在Class View类视图中找到CMainFrame类,右键点击,正正在右键菜单中选择Properties,就会显现属性页,然后正正在属性页的东西栏上点击Tip为Overrides的按钮,下面的列表中就列出了可以浸载的函数,找到OnCreateClient天生浸载函数。

        3. 正正在MainFrm.cpp文件中找到刚浸载的OnCreateClient函数进行修改。由于鸡啄米没有新建其他视图类,以是上下两个窗格的视图都是CExample34View。为了能识别CExample34View类,还需正正在MainFrm.cpp文件中添加#include "Example34View.h",正正在Example34View.h文件中添加#include "Example34Doc.h"。最终OnCreateClient函数修改如下:

C++代码
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.     CRect rc;   
  5.   
  6.     // 获取框架窗口客户区的CRect对象   
  7.     GetClientRect(&rc);   
  8.   
  9.     // 创建静态分割窗口,两行一列   
  10.     if (!m_wndSplitter.CreateStatic(this, 2, 1))   
  11.         return FALSE;   
  12.   
  13.     // 创建上面窗格中的视图   
  14.     if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  15.         return FALSE;   
  16.   
  17.     // 创建下面窗格中的视图   
  18.     if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  19.         return FALSE;   
  20.   
  21.     return TRUE;   
  22.   
  23.     //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
  24. }  

        4. 运行程序,正正在结果界面中关掉其他面板后效果如下:

 静态分割窗口

       如果大家想创建正正在其中某个窗格中再嵌套分割窗口,那么就需要再定义一个CSplitterWnd对象,以父窗格地点的CSplitterWnd对象为父框架窗口创建分割窗口即可。

       分割窗口的实质就讲到这里了。鸡啄米依然谢谢大家的支持。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/226.html
2012年8月24日
作家:鸡啄米 分类:软件开发 浏览: 评论:15