首页 > 应用 > EDA
[导读]摘要:本文以MFC(Microsoft Foundation Class Library)的CsplitterWnd类别为基础,通过对单文档视窗的静态分裂原理进行分析,介绍混合静态分裂视窗的实现方法,并深入阐述子视窗的视图动态切换技术。
前言在许多视

摘要:本文以MFC(Microsoft Foundation Class Library)的CsplitterWnd类别为基础,通过对单文档视窗的静态分裂原理进行分析,介绍混合静态分裂视窗的实现方法,并深入阐述子视窗的视图动态切换技术。

前言

在许多视窗应用软件中,通常要在屏幕上同时显示若干个子视窗,以显示同一个文档的不同部分,或者是在每个视窗中分别显示不同文档的内容。为了实现多视窗界面,可以采用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类别的角度去分析混合静态分裂视窗的实现方法,希望能给读者起到抛砖引玉的作用。



来源:ks990次

本文引用地址: http://www.21ic.com/app/eda/201806/769780.htm

换一批

延伸阅读

[新鲜事] 无线充电!迪士尼研究院展示纯无线供电房间

无线充电!迪士尼研究院展示纯无线供电房间

近年来,无线充电在智能机领域的发展似乎并不是那么顺利,但这并不能阻挡业界对这项技术的深入研究。......

关键字:无线充电 迪士尼研究所 准静态空腔共振

[猎聘集] 几种简单保持积极心理的方法

几种简单保持积极心理的方法

书上有很多保持积极心理的方法,这里介绍几个本人亲自尝试过的简单方法,只要你去做就会有惊人的效果:1.每天写下好的3件事情。这3件事情不论大小,只要是你觉得好的进展就好,例如可以是看到某人的微笑,又或者是工......

关键字:保持 方法

[猎聘集] 使人快乐的小方法

使人快乐的小方法

精神胜利法。这是一种有益身心健康的心理防卫机制。在你的事业、爱情、婚姻不尽如人意时,在你因经济上得不到合理对待而伤感时,在你无端遭到人身攻击或不公正的评价而气恼时,在你因生理缺陷遭到嘲笑而郁郁寡欢时,......

关键字:方法

[新鲜事] 美国外科医生发现永久改变人眼颜色方法

美国外科医生发现永久改变人眼颜色方法

现在一位外科医生已经设计出利用人工虹膜植入改变人眼颜色的永久性方法肯尼思-罗森塔尔博士是这项手术的先驱,人工虹膜植入每只眼睛需要花费大约15分钟,并需要在局部麻醉下进行据国外媒体报道,彩色隐形眼镜非常流行......

关键字:人眼 颜色 方法 改变 永久 外科 医生 发现 美国

[猎聘集] 都市白领6种方法爱自己

都市白领6种方法爱自己

人人都有疲惫的时候,此时要给自己一点时间,给自己的心灵做个按摩,好好爱自己。1.换个新造型。去理发店,烫个卷发,或将长发剪短,看着镜子中陌生又漂亮的自己会心一笑;或去商场,挑选未曾尝试过的眼影或口红,尝......

关键字:方法

[猎聘集] 高效职场:事半功倍的7个方法

高效职场:事半功倍的7个方法

导语:为什么你花费更多的时间,却得不到预期的效果?这里有高效职场的7个方法,招招让你事半功倍。 工作中,很多人往往苦于耗时长,成效少。下面的这七条精益法则不仅仅可以用于市场营销活动,也可以用于其他的工作......

关键字:方法

[真心话] 干货!地震来临我们应该怎样正确使用手机

干货!地震来临我们应该怎样正确使用手机

8月8日晚,四川九寨沟发生了7.0级地震,9日凌晨新疆精河也发生了6.1级地震。天灾无情,在我们遇到地震的时候,手机应该怎么使用才能物尽其用呢?......

关键字:地震 手机 使用方法

[新鲜事] 碎片化Android平台:App开发和管理的5个方法

碎片化Android平台:App开发和管理的5个方法

碎片化的Android平台让应用开发和管理相当困难,但是最近的云服务为测试提供了快速可见的新方法,让开发者们更方便地管理各个设备上的应用。在最近波特兰的PIE演示日中, AppThwack 的Trent Peterson表示,通过基于云......

关键字:Android App 方法

[猎聘集] 两种方法 测试你的创意是否靠谱

两种方法 测试你的创意是否靠谱

如果你每天都为蓬勃而出的无数创意兴奋不已,同时也在为创意是否靠谱,是否能满足普遍用户的需求而苦恼,这里有两种方法助你渡过创业黑暗期。 全世界的创业者们每天都诞生出无数前所未有的创意,每天都有巨量的、地......

关键字:方法 测试 创意

[消费类电子新闻] 想要iPhoneX吗?我来教你怎么抢

想要iPhoneX吗?我来教你怎么抢

苹果iPhoneX即将发布,如今土豪遍地走,人手都想要个iPhoneX,但是产能不足、供货量不够、购买需求旺盛的传闻不断。当然,如果你拿个两万预算购买iPhoneX的话......土豪,我们交个朋友吧。......

关键字:苹果 iPhoneX 购买方法

[通信技术] 华为企业业务“方法论”:红七军团和井冈山精神

华为企业业务“方法论”:红七军团和井冈山精神

21ic通信网讯,华为企业业务中国区总裁马悦戏称他带领的团队是“红七军团”,因为团队成员来自华为原中国区行业市场部、原华为赛门铁克合资公司、华为软件部门、华为终端部门、运营商BG、社会招聘以及海外......

关键字:井冈山 红七军 方法论 华为
条评论

我 要 评 论

网友评论

热门关键词

技术子站

更多

项目外包

更多

推荐博客