前言

  在许多视窗应用软件中,通常要在屏幕上同时显示若干个子视窗,以显示同一个文档的不同部分,或者是在每个视窗中分别显示不同文档的内容。为了实现多视窗界面,可以采用MDI(Multiple Document Interface)的多文档模式进行处理,但是多文档的应用程序设计与维护相对于单文档的应用程序而言比较复杂。而且,如果要在屏幕上同时显示多个子视窗,通常要利用视窗重叠函数进行管理,每个子视窗的位置往往需要用鼠标人为设定,过多的人为干预降低了程序使用的效率。因此,如果能对单文档视窗做适当的分裂,无疑程序使用者将可以得到更易于操作的接口,数据的显示也更加直观和方便。本文通过对单文档视窗的静态分裂原理进行分析,实现上述要求。

  二分裂视窗的类型

  视窗的分裂可分为两种类型,一是动态分裂,二是静态分裂。动态分裂可以让使用者通过拖曳分裂方块的使用,将视窗分裂。但是,动态分裂最多只可以将视窗分裂为2×2个子视窗,不能进行混合分裂视窗,所有子视窗的属性和父视窗都是一样的,而且子视窗的数据通常来源于同一处。而静态分裂,使用者除了可以调整子视窗的大小和进行混合分裂视窗外,最多可将视窗分裂为16×16个子视窗,每个子视窗可以有各自不同的视图类(CView),各个子视窗显示的数据可以来自于不同的数据源。不论是要创建动态分裂视窗还是静态分裂视窗,都必须要利用MFC的CSplitterWnd类别来完成视窗的分裂。

  混合静态分裂视窗的实现

  混合分裂视窗是指在子视窗中进行视窗的再分裂。在MFC的框架下,混合分裂视窗必须完成三件工作:

  ⑴在视窗框架类别中定义CSplitterWnd控件为其属性(数据成员)。

  ⑵重载视窗框架类别中的OnCreateClient函数(CFrameWnd::OnCreateClient),建立静态分裂子视窗,为静态分裂子视窗填充视图。

  ⑶建立维持各子视窗同步更新的机制。

  首先,利用MFC AppWizard生成一个单文档应用程序,在应用程序的CMainFrame类别中声明CSplitterWnd类别的数据成员。

  其次,重载CMainFrame类别中的OnCreateClient(LPCREATESTRUCT,CCreateContext* pContext)函数。在该函数中利用CsplitterWnd类别的构造函数Create Static(CWnd *pParentWnd,int nRows,int nCols,DWORD dwstyle,UINT nID) 创建混合静态分裂子视窗,即在Create Static分裂出的子视窗中利用CsplitterWnd类别的控件再一次分裂视窗。

  Create Static函数的参数含义为:

  ·pParentWnd是准备建立静态分裂视窗的视窗框架控件的指针;

  ·nRows和nCols是准备建立静态分裂视窗行数(nRows)与列数(nCols)

  因此,创建的静态分裂子视窗个数为nRows × nCols个,这两个参数最小不得小于0,最大不可超过16;dwstyle是设定子视窗的形式;nID静态分裂的代号(ID),此代号预设为AFX_IDW_PANE_FIRST,若静态分裂视窗位于另一个分裂视窗内时,不可以使用默认值,可以利用CsplitterWnd类别的成员函数IdFromRowCol(int row,int col)获得。利用CsplitterWnd类别的成员函数Create View (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext) 为静态分裂子视窗填充视图,在将视图与子视窗关联时必须先完成子视窗的创建。

  Create View函数的参数含义为:

  ·row和col是指定准备建立View控件的子视窗,其指定的方式是以表示该子视窗所在的行列位置;

  ·pViewClass是指定用于建立子视窗View控件的View类别,该类别需要被声明为Run-Time类别;

  ·Sizeini是View控件的起始大小;pContext是一个指向记录应用程序所使用的视窗框架控件、Document控件,以及View控件之变量的指针,此参数在CMainFrame::OnCreateClient函数被调用时传入,再由该函数传递给此函数。

  ·CsplitterWnd类别的成员函数SetColumnInfo(int col,int cxIdeal,int cxMin)和SetRowInfo(int row,int cyIdeal,cyMin)为设置子视窗的宽度和高度,参数cxIdeal和cxMin是指定子视窗的宽度和最小宽度,cyIdeal和cyMin是指定子视窗的高度和最小高度,在使用这两个函数调整子视窗的大小后还应该使用该类别的成员函数RecalLayout()重新调整视窗框架的布局。如果要设定视窗框架里的活动子视窗,可以通过CsplitterWnd类别的成员函数SetActivePane(int row,int col,CWnd* pWnd=NULL)来完成,该函数指定子视窗的方式有两种,一是指出子视窗所在的行列,二是传入指向该子视窗的控件指针。

  最后,将视窗分裂成多个子视窗后,整个视窗程序中将存在多个View控件。当在其中一个View控件执行更新操作时,如何让其它View控件同步更新数据?可以通过文档类别(CDocument)的UpdateAllViews(CView* pSender,LPARAM lHint,CObject* pHint)成员函数的调用,再由该函数分别调用目前存在于视窗程序中各View控件的On Update函数来完成数据的同步更新。

  UpdateAllViews函数的参数含义为:

  ·pSender是指向引发更新操作的View控件指针,如果传入NULL表示所有视图都要执行更新操作;

  ·lHint是用于传送更新视图时,需要传送的额外信息参数;

  ·pHint是指向记录更新视图所需额外信息的控件。在调用该函数时,将View控件的指针传入的目的是要告诉该函数该子视图已经完成数据更新,该函数不需要再调用该子视图的On Update进行数据更新。
  子视图的动态切换

  在多视图应用程序中,可以通过改变CCreateContext对象的值,来创建更加灵活的视图,实现多视图的动态切换。CCreateContext是MFC框架所使用的一种数据结构,它将构成文档/视图结构的组件联系起来。这个结构包括指向文档的指针、视窗框架的指针、视图的指针以及文档模板的指针,它还包含一个指向CRuntimeClass结构的指针,以指明所创建的视图的类型。

  其数据成员如下:

  ·m_pNewViewClass是指向创建上下文的视图的CRuntimeClass结构的指针;

  ·m_pNewDocTemplate是指向与视窗框架的创建相联系的文档模板的指针;

  ·m_pCurrentDoc是指向文档对象的指针,以和新视图联系起来;

  ·m_pLastView是指向已存在的视图的指针,它是新产生的视图的模型;

  ·m_pCurrentFrame是指向已存在的视窗框架的指针,它是新产生的视窗框架的模型。

  此外,任何一个从CObject类别继承而来的子类别,在使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE、DECLARE_SERIAL三个中的任意一个时都会产生一个CRuntimeClass结构的静态对象,RUNTIME_CLASS返回的就是这个对象的指针,这个对象包含了其基类和本身在运行时刻的信息。

  在单文档静态分裂视窗的应用程序中,利用CsplitterWnd类别的成员函数Delete View(int row,int col)可以删除子视窗的原有视图,然后再通过该类别的成员函数Create View为子视窗创建新的视图。但是,创建新视图前必须初始化创建上下文相关指针,即对CCreateContext结构赋值。值得注意的是,使用Create View函数创建的新视图不能自动调用视图类别的成员函数OnInitialUpdate和自动显示并且激活新视图,需要人工调用OnInitialUpdate函数和ShowWindow(SW_SHOW) 函数,这些函数的调用都可以通过CsplitterWnd类别的成员函数Get Pane(int row,int col)获得新视图的指针来完成。

  结束语

  在MFC的框架下,混合分裂视窗有多种编程方法,本文只是从CsplitterWnd类别的角度去分析混合静态分裂视窗的实现方法,希望能给读者起到抛砖引玉的作用。

VC++实现混合静态分裂视窗的方法相关推荐

  1. c 语言 多进程,VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. ...

  2. 直接访问静态图片_详解nginx和tomcat访问图片和静态页面的配置方法

    概述 生产环境下,有时候需要访问图片,正常需要应用ftp.nginx等配套使用,但是有时候为了简化,可以用以下的两种简单的访问,说实话,就是为了偷懒,但是效果是能有的,这就行了,所以今天做这个简化版的 ...

  3. 让Apache支持Rewrite静态页面重写的方法

    Apache下Rewrite静态页面重写的方法,需要的朋友可以参考下. 首先确定您使用的 Apache 版本,及是否加载了 mod_rewrite 模块. Apache 1.x 的用户请检查 conf ...

  4. 利用Java生成静态HMTL页面的方法收集

    利用Java生成静态HMTL页面的方法收集 生成静态页面技术解决方案之一 转载者前言:这是一个全面的jsp动态页面静态化方案,本站的帖子静态化方案将借鉴这篇帖子中方法.向[url]http://www ...

  5. jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结

    转载自   jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结 为什么使用该功能? 项目中的每个页面都包含产品名称.Logo.版本等信息,我希望修改一处,其它所有的全部跟着变 ...

  6. VC++中进程与多进程管理的方法[转]

    VC++中进程与多进程管理的方法      关键词: VC++6.0:进程:环境变量:子进程 进程 进程是当前操作系统下一个被加载到内存的.正在运行的应用程序的实例.每一个进程都是由内核对象和地址空间 ...

  7. Android NDK之静态/动态注册Native方法

    一.简介 关于NDK有两种方法注册:静态注册和动态注册. 静态注册: 就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了: 动态注册: 就是为了不要写很长的方法名, ...

  8. nginx加载html目录下图片,nginx配置访问图片路径以及html静态页面的调取方法

    nginx配置访问图片路径以及html静态页面的调取方法 发布时间:2017-03-09 12:06 来源:互联网 当前栏目:web技术类 给大家讲一个快速配置nginx访问图片地址,以及访问html ...

  9. 在VC中动态加载ODBC的方法

    在VC中动态加载ODBC的方法     在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较 ...

最新文章

  1. __proto__和prototype
  2. CSS Guide Lines
  3. C语言:内存的分配与管理
  4. mysql索引1908
  5. JavaScript 编程精解 中文第三版 七、项目:机器人
  6. 阿里云各个地域节点速度测试(测试点到阿里云各站点)
  7. 智能+大数据 在云+互联时代下创造的精准营销
  8. 【推荐实践】Hulu-视频理解在个性化推荐与内容发现中的应用.pdf(附下载链接)...
  9. jquery blockui 遮罩【转】
  10. 利用vCard实现电子名片扫码将个人信息保存到通讯录
  11. 测试用例设计思维导图
  12. 当酒品牌遇上爱“微醺”的年轻人,会擦出怎样的火花?
  13. macbook苹果电脑新手快速上手
  14. 华视cvr-100UC 二代身份证读卡通用函数
  15. 四个方面讲解MPK(安规电容)与CBB电容的区别
  16. Unity学习笔记:个人学习项目《疯狂天才埃德加》纠错文档
  17. webpack-dev-server filename中的路径问题,IntelliJ IDEA local history有效期设置,标签顺序设置,dva call put 解构
  18. 北航宇航学院计算机,2014年北航自动化考生倾情奉献的总结(也试用于宇航学院)...
  19. 崔莺莺要明媒正娶,张生你怎么看?
  20. 2023洗地机哪个牌子的好用?洗地机排行榜推荐

热门文章

  1. 废掉一个产品经理最常见的方式,就是天天画原型
  2. 低幼年龄段在线教育白皮书
  3. 女人的安全感到底是什么?
  4. php javascript 不执行,javascript – 不工作php按钮来执行操作
  5. eclipse aop连接点joinpoint方法点不出来_(面试必备)你必须要懂的Spring-Aop
  6. 地方政府大数据发展的现实与理想
  7. 作者:郑飞翔(1982-),男,中国农业科学院农业环境与可持续发展研究所副研究员。...
  8. 【计算机组成原理】虚拟存储器和Cache的比较
  9. 【Java】计算二进制数中1的个数
  10. 【操作系统】中断和异常的比较