zoukankan      html  css  js  c++  java
  • MFC之拆分窗口

    7.3.1 多视图
    许多文档只要求单个视图,但每个文档可支持一个以上的视图。为了帮助编程人员实现多个视图,文档对象保留它的视图列表、为添加和移去视图提供成员函数,例如,提供的UpdateAllViews成员函数可使多个视图知道文档数据何时已被更改。
    MFC支持在同一文档上使用多个视图的3种通用模式,这些模式是:
    (1) 在各自MDI文档窗口中包含同一个视图类的多个视图对象。用户有时需要应用程序能为同一个文档打开另一个文档窗口,以便能同时使用两个文档窗口来查看文档的不同部分内容。用MFC AppWizard创建的多文档应用程序支持这种模式,当用户选择“窗口”菜单的“新建窗口”命令时,系统就会为第一个文档窗口创建一个副本。
    (2) 在同一个文档窗口中包含同一个视图类的多个视图对象。这种模式实际上是使用“切分窗口”机制使SDI应用程序具有多视的特征。
    (3) 在单独一个文档窗口中包含不同视图类的多个视图对象。在该模式下,多个视图共享同一个文档窗口。它有点象“切分窗口”,但由于视图可由不同的视图类构造,所以同一个文档可以有不同的显示方法。例如,同一个文档可同时有文字显示方式及图形显示方式的视图。
    7.3.2 窗口的切分
    1、 静态切分和动态切分
    对于“静态切分”窗口来说,当窗口第一次被创建时,窗格就已经被切分好了,窗格的次序和数目不能再被改变,但用户可以移动切分条来调整窗格的大小。每个窗格通常是不同的视图类。
    对于“动态切分”窗口来说,它允许用户在任何时候对窗口进行切分,用户既可以通过选择菜单项来对窗口进行切分,也可以通过拖动滚动条中的切分块对窗口进行切分。动态切分窗口中的窗格通常使用的是同一个视图类。当切分窗口被创建时,左上窗格通常被初始化成一个特殊的视图。当视图沿着某个方向被切分时,另一个新添加的视图对象被动态创建;当视图沿着两个方向被切分时,新添加的三个视图对象则被动态创建。当用户取消切分时,所有新添加的视图对象被删除,但最先的视图仍被保留,直到切分窗口本身消失为止。
    无论是静态切分还是动态切分,在创建时都要指定切分窗口中行和列的窗格最大数目。对于静态切分,窗格在初始时就按用户指定的最大数目划分好了;而对于动态切分窗口,当窗口构造时,第一个窗格就被自动创建。动态切分窗口允许的最大窗格数目是2 x 2,而静态切分允许的最大窗格数目为16 x 16。
    2、 切分窗口的CSplitterWnd类操作
    在MFC中,CSplitterWnd类封装了窗口切分过程中所需的功能函数,其中成员函数Create和CreateStatic分别用来创建“动态切分”和“静态切分”的文档窗口,函数原型如下:
    BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin,
    CCreateContext*pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE
    |WS_HSCROLL| WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
    UINT nID = AFX_IDW_PANE_FIRST );
    BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE,
    UINT nID = AFX_IDW_PANE_FIRST );
    其中,参数pParentWnd表示切分窗口的父框架窗口。nMaxRows表示窗口动态切分的最大行数(不能超过2)。nMaxCols表示窗口动态切分的最大列数(不能超过2)。nRows表示窗口静态切分的行数(不能超过16)。nCols表示窗口静态切分的列数(不能超过16)。sizeMin表示动态切分时允许的窗格最小尺寸。
    CSplitterWnd类成员函数CreateView用来为静态窗格指定一个视图类,并创建视图窗口,其函数原型如下:
    BOOL CreateView( int row, int col, CRuntimeClass* pViewClass,
    SIZE sizeInit, CCreateContext* pContext );
    其中,row和col用来指定具体的静态窗格,pViewClass用来指定与静态窗格相关联的视图类,sizeInit表示视图窗口初始大小,pContext用来指定一个“创建上下文”指针。“创建上下文”结构CCreateContext包含当前文档视图框架结构。
    3、 静态切分窗口实现
    利用CSplitterWnd成员函数,用户可以在文档应用程序的文档窗口中添加动态或静态切分功能。
    4、示例程序——将单文档应用程序中的文档窗口静态分成3 x 2个窗格
    (1) 用MFC AppWizard创建一个默认的单文档应用程序Ex_SplitSDI。
    (2) 打开框架窗口类MainFrm.h头文件,为CMainFrame类添加一个保护型的切分窗口的数据成员,如下面的定义:
    protected: // control bar embedded members
    CStatusBar m_wndStatusBar;
    CToolBar m_wndToolBar;
    CSplitterWnd m_wndSplitter;
    (3) 用MFC类向导创建一个新的视图类CDemoView(基类为CView)用于与静态切分的窗格相关联,如图7-13所示。
    (4) 重写CMainFrame类的OnCreateClient函数(当主框架窗口客户区创建的时候
    自动调用该函数),并添加下列代码:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
    CCreateContext* pContext) {
    CRect rc;
    GetClientRect(rc); // 获取客户区大小
    // 计算每个窗格的平均尺寸
    CSize paneSize(rc.Width()/2-16,rc.Height()/3-16);
    m_wndSplitter.CreateStatic(this,3,2); // 创建3 x 2个静态窗格
    m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDemoView),paneSize,
    pContext); // 为相应的窗格指定视图类
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDemoView),paneSize,
    pContext);
    m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CDemoView),paneSize,
    pContext);
    m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CDemoView),
    paneSize,pContext);
    m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CDemoView),
    paneSize,pContext);
    m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CDemoView),
    paneSize,pContext);
    return TRUE;
    }
    (5) 在MainFrm.cpp 源文件的开始处,添加视图类CDemoView 的包含文件:
    #include "DemoView.h"
    (6) 编译并运行,结果如图7-14 所示。

    7.3.3 多视图编程示例
    下面的示例是在一个多文档应用程序Ex_Rect 中为同一个文档数据提供两种不同的显示和编辑方式,如图7-15 所示。在左边的窗格中,用户可以调整小方块在右边窗格的坐标位置。而若在右边窗格中任意单击鼠标,相应的小方块会移动到当前鼠标位置处,且左边窗格的编辑框内容也随之发生改变。

  • 相关阅读:
    ***php 数组添加关联元素的方法小结(关联数组添加元素)
    阿里云PHP Redis代码示例
    linux内核编程笔记【原创】
    linux RTC 驱动模型分析【转】
    linux 实时时钟(RTC)驱动【转】
    RTC系统【转】
    IRQ和FIQ中断的区别【转】
    NAND Flash【转】
    NandFlash详述【转】
    展讯NAND Flash高级教程【转】
  • 原文地址:https://www.cnblogs.com/x739400043/p/4732172.html
Copyright © 2011-2022 走看看