机房收费系统中有一个很高大上的功能,那就是窗体遍历——当一个MDI子窗体打开时,其他的子窗体自动最小化到底部,这样可以防止因加载窗体过多而造成不便。
开始我在每个子窗体的form Activate 事件下面加了如下的代码:
<<span style="font-size:24px;">span style="font-size:24px;">1</span>.<span style="font-size:24px;"> For Each a In Forms
2. If a.Name <> Form1.Name And a.Name <> frmMain.Name And a.Name <> Me.Name Then
3. a.WindowState = 1
4. Form1.ZOrder 1
5. End If
6. Next </span>
</span>
代码中的form1代表子窗体,frmMain 为父窗体。
但是出现了一个恐怖的现象,就是父窗体上的控件浮现在子窗体上,看着就不舒服,老觉得vb有一种要疯的赶脚……
然后我就开始一句一句的看这段代码,把form1.Zorder 1 这一句代码改成form1.Zorder0 就OK了,所以就在这给大家分享一下相关的知识:
简单的说两个同级的控件,摆在同一个地方, zorder(0) 可将一控件在前面显示遮住另一个控件,zorder(1)则可将此控件放在后面, 让原来被遮住的另一个控件在前面显示。所以之前是因为我们将form1的zorder设为1,那么就会让form1 的窗体在前面,但是frmMain 的控件却在前面,所以出现了那个恐怖的情景……
下面是官方的解释:
ZOrder 用在不同的地方,有二种不同的意义:
1、用于 MDIForm 中的 Child Form 时,指的是每一个 Child Form 的上下位置关系。
2、用于每一个 Form 中的所有控制项时,指的是每一个控制项间的上下位置关系。
注一:一般我们的二度平面座标轴是指 X 座标轴 (东西向)及 Y 座标轴 (南北向),
二个轴构成一个平面,再加上垂直的 Z 座标轴,就构成了三度立体空间了!
所以 ZOrder 指的就是物件在垂直的 Z 座标轴上的上下位置关系。
注二:虽然 ZOrder 指的是物件在垂直的 Z 座标轴上的上下位置关系。
但是很多人搞不清楚,为什么他已经设定了 ZOrder 了,为什么在某些控制项中是无效的?
原因是对单一 Form 或 单一 Container 而言,在垂直的 Z 座标轴上又分成三个层次:
最下一层:显示图形方法结果的绘图空间。
中间一层:用来显示图形物件(例如 Image) 和 Label 控制项。
上面一层:显示所有非图形控制项,例如 CommandButton、CheckBox 或 ListBox。
而 ZOrder 只对单一层次内的控制项有效而已!
例如:您如果设定 Label 及 Image 的 ZOrder 是有效的,因为它们都在中间一层!
您如果设定 Label 及 CommandButton 的 ZOrder 是无效的,因为它们在不同层!
最重要的是:不管 ZOrder 如何设定,
在上面一层的物件永远会在中间一层的物件的上方!
在中间一层的物件永远会在最下一层的物件的上方!
总结:我们就是不断的发现问题,不断的解决问题,不断的积累经验,不断的为人民服务!