我们在使用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