您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页MFC子窗口管理方法及应用

MFC子窗口管理方法及应用

来源:华佗健康网
维普资讯 http://www.cqvip.com

电脑知识与技术 ・・・・・・研究开发・ MFC子窗口管理方法及应用 罗瑞明 (深圳高级技工学校,广东深圳518000) 摘要:本文介绍了MFC对子窗口排列的管理方法,并给出实例说明如何应用该方法简化编程工作。 关键词:MFC;窗口;排列 中图分类号:TP31 1 文献标识码:A 文章编号:1009—3044(2006)20—0167—02 LUO tkui——ming Management and Applications of MFC Sub-window (Shenzhen Senior Technical Institute,Shenzhen 5 1 8000,Chim) Abstract:This text introduced the MFC tO the management that window way arrange,and explain that this method can simplify to weave he ditstance work for an example Key WOr6S:MFC;window;arrange 众所周知,在用MFC编写的程序中,主窗口中除了中间的视 图窗口外,上边有工具栏,下边有状态栏。工具栏和状态栏都是控 需要拉伸来和客户区对齐。 制条窗口,控制条窗口和视图窗口共享同一客户区,互不重叠。当 主窗口的尺寸改变时,主窗口会重新排列这些窗口,保持相互位 置关系不变。状态条始终保持在客户区底部,其宽度与客户区宽 度一致;工具栏则停靠在主窗口的某一边不变,其宽度或高度与 客户区的宽度或高度一致;视图窗口则填满主窗口的剩余空间。 MFC通过一种简单的机制对控制条窗口和视图窗口的排列 nFlags指定函数操作类型。ReealeLayout 0将它设定为repo- sEx ̄a。在这种情况下,函数依次给ID介于nlDFimt和nlDLast之 间并且不等于nlDl ̄fiOver的子窗口发送WM_SIZEPARENT消 息,传递的参数中有客户区可用区域,第一个子窗口获得的是初 始可用区域,每个响应消息的子窗口确定它需要多少空间,并从 可用区域中减去自己占据的部分.后面的子窗口将获得逐渐减少 的可用区域。当所有的子窗1:3都响应完毕,函数用lpReetParam对 剩余区域进行修正。然后把剩余空间留给nlDl ̄ftOver指定的窗 口,如果nlDl ̄ftOver为NULL,则剩余空间留给视图窗口。 进行了有效管理。了解它的工作机制,我们可以把自己的子窗口 交给MFC管理。充分利用MFC的强大功能,减少编程工作量。 本文首先介绍MFC管理子窗口的工作机制。这一过程是父 窗口与子窗口共同协作完成的。然后,通过例子说明如何实际应 用该方法。 1.3 CWnd::OnSizeParent0 OnSizeParent0函数响应WM—SIZEPARENT消息,这是MFC 自定义的消息。消息的两个参数中,wParam保留不用,lParam是一 个指向AFX SIZEPARENTPARAMS结构变量的指针,结构定义如 下: Steet AFXSIZEPAREN rI甲ARAMS f _1工作机制 整个过程开始于主框架窗口发生变化的时候。要么是窗口尺 寸发生了变化。要么是添加或者删除了工具栏,要么是浮动工具 栏改变了形状。这些变化都会导致主框架窗口对其子窗口进行重 排。即调用CFrameWnd的ReealeLayout0函数。 1.1 CFmmeWnd::ReealeLayout0 ReealeLayout0是一个虚函数。其缺省实现除了调用CWnd:: RepositionBars0以外几乎什么都不做。调用方式如下: RepositionBars&m_HDWP hDWP: RECT rect; SIZE sizeTotal; BOOL bStretch;}; RepositionBars0给结构变量的成员赋值,bStreteh就是Reposi. tionBars的参数bStretch.reet指定可用的客户区域。 成员hDWP是用来成批设置窗口位置和大小的。首先通过调 reposExtra, (0,Oxf ̄,AFWIDWPANEFIRST,——reetBorder); RepositionBars函数实际负责子窗口的重排。函数还有两个参 1.2 CWnd::RepositionBars 数没有赋值,即采用缺省值。 该函数语法表达如下: 用BeginDeferWindowPos0函数获得hDWP。子窗口则调用Defer- WindowPos0函数来重新设置位置和尺寸,hDWP是函数的一个参 数。当所有子窗口设置完毕后,调用EndDeferWindowPos0i ̄数,就 可以一次性完成所有子窗口的排列。这种方法加快了窗口设置和 绘制的过程。 void RepositionBars( UINT nIDFirst.UINT nlDLast, 围 //参与重排的子窗口ID范 成员sizeTotal用来累计子窗口占用区域的总和,子窗口在响 应WM—SIZEPARENT消息时要把自己的大小累加到sizeTotal成 员的ex和cy成员里。 UINT nlDl ̄fiOver, UINT nFlags. //获得剩余空间的窗口ID //操作类型 在OnSizeParent0i ̄数中.子窗口必须计算自己需要多大的空 间。然后修改reet成员的值,减去自己占据的部分,并适当调整窗 LPRECT lpReetParam:NULL, //修正参数 LPRECT lpRectClient=NULL, //可用客户区域 BOOL bStretch=TRUE //拉伸窗口标志 ); nlDFirst和nlDLa ̄指定了参与重排的子窗口范围;lpReet- Client则指定父窗口客户区的初始可用区域,如果lpRectClient为 口的大小和位置。RepositionBars0将把修改后的feet成员传给下 一个子窗口。 1.4小结 下面我们总结一下主窗口重排子窗口的过程: 1.4.1当窗口尺寸或内容改变时,CFrameWnd::ReealeLayout0 函数被调用。 NULL,则Repositi0nBarsO通过调用GetClientReet0i ̄数获得整个 客户区大小.以此作为初始可用区域;bStreteh则指定子窗口是否 收稿日期:2006-04-17 1.4.2 ReealeLayout0随后调用CWnd::RepositionBars0i ̄数,并 作者简介:罗瑞明(1975-),男,毕业于南京理工大学计算机科学与工程系,研究方向:网络开发。 1钾 维普资讯 http://www.cqvip.com

\.研究开发...... 电脑知识与技术 告诉它允许窗口中所有的控制条窗口占用其所需空间,然后将剩 lpLaY0ut.>rect.t0p+=rect.Height0; 余空间留给视图窗口。 //增加所有子窗口占用区域的大小 1-4.3 RepositionBars 0向窗口中的子窗口逐个发送 lpLayout->sizeTota1.CX+=rect.Width0; WM—SIZEPARENT消息,它给子窗口传递一个逐渐减少的可用客 lpLayout->sizeTota1.cy+=rect.Height0; 户区域。 ,,调整窗口位置 1-4.4子窗口通过CWnd::OnSizeParent 0函数响应 if(1pLayout->hDWP!=NULL 1 WM—SIZEPARENT消息,它计算窗121需要多大的空间,并从可用 AfxRepositionWindow(1pLayout,m_hWnd,&rec0;l 空间中减去占用的空间 retum 0;} 1_4_5 RepositionBars0把剩余的客户区域留给视图窗口。 在这里需要注意几点: 2应用实例 2_3.1 OnSizeParent0函数在ClassWizard里面是没有的,需要 借鉴MFC管理子窗口的方法,我们只需要在子窗口中响应 手工添加 WM_SIZEPARENT消息,在响应函数中划出子窗口需要的空间. 2.3-2为了使用AFx—SIZEPARENTPARAMS结构,需要在文 就可以由MFC来管理子窗口的排列。下面用一个单文档应用程 件开头包含头文件: 序为例,我们在主框架窗口中增加一个子窗口,它始终占用客户 #include<afxpriv.h> 区域的一半 2.4在框架窗口类CMainFrame中声明一个CTrack类成员 实现步骤如下: m wndTIalck。 2.1利用AppWizard创建一个单文档应用程序,项目名为 2.5在CMainFrame::OnCreate0函数里面增加如下语句: Reposition。 m_wndTrack.CreateEx( 2.2使用New Class对话框添加新的MFC窗121类CTrack.基 Ws_Ex—CUEN I'EDGE∥窗口扩展风格 类为CWndo AfxRegisterWndClassf//窗口类 2_3重载CTrack类的OnSizeParent0i ̄数。函数代码如下: Cs_HREDRAW I CS_VREDRAW, LRESULT CTrack::OnSizeParent(WPARAM,LPARAM 1Param ::LoadCursor(NULL,IDC ARROW), ) ::CreateSolidBrush(RGB(0,128,128))), {AFX_SIZEPARENTPARAMS lpLayout=(AFx—SIZEPAR. —T(””), //窗口名称 ENTPARAMS*)IParam; WS_VISIBLE I WS_CHILD.//窗口风格 ,,子窗口占用客户区域的上半部分 CRect(0,0,0,0), //窗口大小,不用设置 if(GetStyle0&WS VISIBLE 1 tllis.,,父窗口 f CRect rect; //用于计算窗口矩形 50o0,,窗口ID ,,获取客户区域大小 ); rect=lpLayout->rect; 编译并运行程序,我们就可以看到在主窗口的上半部分多了 ,,计算子窗口需要的空间大小 一个蓝绿色的窗口。如果改变主窗口的大小,该子窗口的位置和 rect.bottom=rect.top+rect.Height0,2: 大小也随着发生变化,它始终保持占据客户区的一半。可以看到, ,,从可用区域中减去该部分区域 将子窗口交给MFC进行管理,编程非常简单。 本程序在Windows 20OO、VC++6.0下编译通过。 (上接第124页) 的情况还是很常见的。应提供适当的机制使操作面板可以主动终 型时,我们建立两个子数据:电路组件列表和引线结点列表。电路 止程序的运行。对于模拟电路的计算需要用到方程或方程组的求 组件列表包含指向各组成电路仿真模型的指针。如果一个电路组 解算法 件出现多次,则会有多个指针指向同一个组件模型的情况。这是 电路状态计算的结果应及时发送到操作面板显示出来,同时 一种网状的结构。这样组合而成的电路可以作为一个电路组件应 也需要发送到存取模块 仔起来。 用于其他场合,必要时又可分开。如果为提高运行效率,可以对仿 6操作面板 真函数式进行组合化简,并消去内部无关结点。这一过程我们称 操作面板除了具备一般的窗体软件的功能之外.还需要较强 为电路合成。合成的电路可以象基本电路一样使用,但不能再分 的图形操纵能力,需要能拖曳代表电路的图形,并能实现电路引 开。我们现在可以初步实现电路的组合和分解,但电路合成还需 脚连线的功能。具体做法是将电路图形封装成一个组件,可以整 要人工干预。 体拖曳。在其上设立热点,可以感知鼠标连线操作。电路具备多套 5模拟运行程序 图形,可以显示框图、实物图等外观,还能够按比例缩放。这些数 模拟运行程序是整个系统的核心。由于采用了合适的存取机 据也都由存取模块负责管理,作为仿真模型的一部分。 制,许多工作都由存取模块来完成了。模拟运行程序主要负责接 7结束语 收操作面板传递来的信息完成电路的组合、运行状态设定、计算 该系统主要是针对计算机硬件实验教学而开发的。如果用于 电路运行的状态变化等。 科学研究或应用开发,则还存在元件种类少,仿真精度不高等问 整个电路其实就是一个组合电路。模拟运行程序登记添加的 题。但用软件来仿真硬件进行虚拟实验还是很有价值的。 电路组件,建立引线结点,并将数据发送给存取模块。数据在内存 参考文献: 中同样可以采用上述表示机制。 【1】孙燕莲,韩巍,文福安.构建仿真实验系统关键技术的研究 计算电路运行的状态是模拟运行程序最重要的工作。模拟运 『J].实验技术与管理,2005,22(7):68—71. 行程序首先建立已知量和未知量列表,然后逐个查询组件电路的 『2]王玉华,黄硕之.计算机组成原理课虚拟实验方案【J】.实验技 仿真函数,能够计算的就算出结果,并重新调整已知量和未知量 术与管理.2005.22(4):73—76. 列表.如此循环直至算出全部未知量或判断出尤法继续计算。由 【3】宋善德,何力,欧阳星明,等.数字逻辑虚拟实验系统的研究 于电路初始参数设置不当或电路仿真模型的缺陷,出现无法计算 与设计【J1.计算机工程与科学,2004,26(7):79—82. ‘ 168—I习 l勘-知识与技术 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务