窗口排列类——ETSLayout的使用

本文介绍了如何利用ETSLayout类解决MFC界面在窗口大小改变时控件排列不变的问题。步骤包括将对话框类继承自ETSLayoutDialog,定义InitialLayout函数布局控件,并在OnInitDialog中调用UpdateLayout()。ETSLayout提供了多种排列方式,如垂直/水平排列、扩展模式(GREEDY、ABSOLUTE等)和连接模式(ALIGN_LEFT、ALIGN_CENTER等)。

 我们在使用MFC进行界面编程时,会发现当窗口放大或者缩小的时候,里面的控件大小排列等都不会随着窗口的变化而变化,下面介绍一个很好用的类,可以帮助我们解决这个问题。

1 首先下载ETSLayout类,将其加入project中。

2 在需要排列的对话框类中包含ETSLayout的头文件,并将其父类从CDialog替换为ETSLayoutDialog,注意,对话框类中所有的CDialog字样必须全部替换,同时,将对话框边框模式改为Resizing。

3 接下来这一步很重要,我们将介绍如何按照你想要的方式来定义对话框的排列

 

上图中,左边的对话框里列出了所有控件的ID,右边的对话框被红框和蓝框分隔开,注意到,这里红框所框起的界面是垂直排列的,而蓝框是水平排列的。

定义一个函数InitialLayout

        

首先,创建一个根面板,排列方向设为Vertical,然后按照顺序排列下来。pane参数用来创建一个子面板,它的原型为

参数说明见下图

itemGrowing则充当了一个占位符的角色。

下面对其排列方向和扩展形式做个说明

(1)方向

HORIZONTAL和VERTICAL

对于HORIZONTAL,所有的item和子面板按照从左向右的方式添加

VERTICAL则是按照从上到下的顺序添加

(2)扩展模式

GREEDY(默认)

一个Greedy(贪婪模式)的item和面板同时向水平和垂直方向扩展,如果只有一个Greedy,则它将会占据除了其他控件外所有剩余的空间,如果有多个Greedy,剩余的空间将被平均分配。

ABSOLUTE_HOZE

如果你希望不要改变一个控件或者面板的水平大小,则要用到这个模式。值得注意的是,具有这种模式的面板,它所包含的item在水平方向上也不会扩展,即使这个item的模式为GREEDY。另一方面,一个GREEDY面板,如果仅包含ABSOLUTE_HOZE类型的item,它也允许在水平方向上进行扩展。

ABSOLUTE_VERT

与ABSOLUTE_HOZE类似

RELATIVE_HOZE

这种模式使得item可以以一定比例的大小来覆盖剩余空间,你需要给定一个x大小,它是一个百分比(1-100),x-size为30意味着它在水平上将占据剩余空间的30%,如果要填满整个空间,你可以使用这个模式(比如一个item60%,一个40%)或者GREEDY模式。

RELATIVE_VERT

与RELATIVE_HOZE类似

 

注意RELATIVE_HOZE|RELATIVE_VERT并不会产生一个水平上x%,垂直上y%的可用空间,你可以通过在RELATIVE_VERT面板中设置一个RELATIVE_HOZE来达到这种需求。

NORESIZE

按照item原有大小排列,它被定义为ABSOLUTE_HOZE|ABSOLUTE_VERT

(3)连接模式

 

当出现上图这种情况时,就需要用到连接模式了,他用于连接扩展模式

ALIGN_LEFT

item紧挨剩余空间的左边框

ALIGN_RIGHT

item紧挨剩余空间的右边框

ALIGN_TOP

item紧挨剩余空间的上边框

ALIGN_BOTTOM

item紧挨剩余空间的下边框

ALIGN_HCENTER

item在剩余空间的水平居中

ALIGN_VCENTER

item在剩余空间的垂直居中

ALIGN_CENTER

item在剩余空间的居中

ALIGN_FILL_HOZE

item在剩余空间中进行水平拉伸,忽略他的最初的扩展模式

ALIGN_FILL_VERT

item在剩余空间中进行垂直拉伸,忽略他的最初的扩展模式

ALIGN_FILL

item在剩余空间中同时往水平和垂直方向拉伸,忽略他的最初的扩展模式

4 在对话框的OnInitDialog函数中加入

参考:http://www.codeproject.com/KB/dialog/layoutmgr.aspx?msg=3146482

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值