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 所示。在左边的窗格中,用户可以调整小方块在右边窗格的坐标位置。而若在右边窗格中任意单击鼠标,相应的小方块会移动到当前鼠标位置处,且左边窗格的编辑框内容也随之发生改变。

MFC之拆分窗口的更多相关文章

  1. MFC单文档视图拆分窗口和相关链接

    第一步:准备2个视图类(如CTViewOne, CTViewTwo) 第二步:在CMainFrame类的头文件中添加数据成员变量: //MainFrm.h protected: CSplitterWn ...

  2. MFC拆分窗口及它们之间的数据交换(转)

    转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...

  3. MFC拆分窗口及它们之间的数据交换

    源代码:http://download.csdn.net/detail/nuptboyzhb/4221531 CSplitterWnd类 CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口 ...

  4. MFC单文档多视图程序设计与Splitter拆分窗口

    1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDI ...

  5. JAVA 拆分窗口

    //拆分窗口 import java.awt.*; import javax.swing.*; public class Jiemian8 extends JFrame{ JSplitPane cf; ...

  6. 拆分窗口QSplitter

    拆分窗口中可以添加许多子控件,各个子控件通过拆分线相互分隔开来,拖动该拆分线可以随意改变子控件大小 import sys from PyQt5.QtCore import Qt from PyQt5. ...

  7. Qt QSplitter任意拆分窗口

    Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,本文章给出使用QSplitter分割窗口的例子. QSplitter 继承自QFrame,而QFrame又继承自QWidg ...

  8. MFC程序实现窗口分割,视图快捷插入控件和插入列表

    将视图中插入列表: 1.创建一个MFC应用程序,在MFC Wizard中,生成的类选项,如图 2.选择CListView作为基类 3.在CXXView.cpp(XX为你的程序名)重写虚函数OnInit ...

  9. Cocos2d-X 2.2嵌入MFC的子窗口

    1.在cocos2dx目录下创建基于对话框的MFC工程,对话框中间放一个Picture控件 2.添加cocos2dx的相关头文件包含路径.库包含路径和依赖项,可以参考其他cocos工程设置 3.选中P ...

随机推荐

  1. RabbitMq学习笔记——MingW编译RabbitMQ C

    1.安装cmak,下载地址:https://cmake.org/download/,当前最新版本3.15.1,下载cmake-3.15.1-win64-x64.msi 注意:安装时勾选将bin目录添加 ...

  2. Linux CentOS7 VMware 特殊权限set_uid、特殊权限set_gid、特殊权限stick_bit、软链接文件、硬连接文件

    一.特殊权限set_uid root用户本身拥有对/etc/passwd的写权限,无可厚非:那普通用户呢,这里就用到了setuid,setuid的作用是“让执行该命令的用户以该命令拥有者的权限去执行” ...

  3. 「JLOI2014」聪明的燕姿

    传送门 Luogu 解题思路 很容易想到直接构造合法的数,但是这显然是会T飞的. 我们需要考虑这样一件事: 对于一个数 \(n\),对其进行质因数分解: \[n=\sum_{i=1}^x p_i^{c ...

  4. 「POJ1147」The Buses

    传送门 POJ Vjudge 解题思路 可以首先预处理一下可能成为一条线路的所有方案,然后把这些可能的方案按照长度降序排序,即按照路线上的时间节点从多到少排序. 因为这样我们就可以先确定更多的时刻的状 ...

  5. 「LuoguP3979」遥远的国度

    传送门 Luogu 解题思路 带换根操作的树剖. 换根只会影响更新或查询子树信息的操作. 我们始终保持初始的根不变,然后只要分类讨论一下: 假设当前被查询的节点是 \(u\) 如果 \(u\) 就是根 ...

  6. iterm2常用快捷键

    标签 新建标签: command + t 关闭标签: command + w 切换标签: command + 数字 command + 左右方向键 切换全屏: command + enter 查找: ...

  7. 手把手教你如何在Presentation中拿高分

    掐指一算,留学生们最近应该马上遇到Presentation作业.一般来说,这类的任务会占最终成绩的20-30%,对于期末成绩有一定的影响,如果想拿高分,就需要好好的准备.所以本文算是系列里的第一篇(扫 ...

  8. 吴裕雄--天生自然JAVA数据库编程:JDBC2.0操作

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...

  9. 白手起家Django项目发布上篇_linux centos 环境部署

    在项目发布之前,首先准备好我们编写好的Django项目,这个我们在之后博客有写,大家可以去看, 首先,先开始安装linux服务器,作为Django项目的发布服务器.以Vmware虚拟机为例子,大家也可 ...

  10. 设备树DTS 学习:2-设备树语法

    背景 通过上一讲了解完设备树DTS有关概念,我们这一讲就来基于设备树例程,学习设备树的语法规则. 参考:设备树详解dts.设备树语法详解.设备树使用总结 设备树框架 1个dts文件 + n个dtsi文 ...