现在的位置: 首页 > 综合 > 正文

机房收费系统– MDI子窗体显示技巧

2012年11月10日 ⁄ 综合 ⁄ 共 1458字 ⁄ 字号 评论关闭

        我们所做的机房收费系统,是运用的MDI多窗体方式,对多类数据进行存取和查询!在窗体显示设置上主要会遇到这样两个问题:

1,程序运行后,为达到使用效率高的目的,父窗体显示一个“ 学生刷卡上下机”功能的界面,可是父窗体上除了可以放置picturebox,其他控件都放置不上去。如果拿picturebox当做一个容器放置空间,貌似可以,但是试过以后,发现其他子窗体在加载后会被picturebox挡在后面,无法显示和操作!

        俗话说,点子总比问题多,最后终于有了解决办法:讲一个能满足“学生刷上下机”要求的子窗体,在父窗体的Load事件里 让这个子窗体跟着Load,并且其大小跟父窗体的大小相同,而且利用父窗体的Resize事件 让这个子窗体大小时刻与父窗体保持大小,基本上就达到目的了,如果想把这个子窗体完美嵌在父窗体里,还需把该此窗体的boderstyle属性设置为
0-None。这样这个问题就解决了!

2.我们先把上面的子窗体叫做父窗体的底衬窗体,当底衬窗体设置好后,又出现了这样的问题:当其他子窗体加载后,如果不小心点击到了底衬窗体,底衬窗体被激活在所有窗体的最前面,结果这个倒霉的子窗体就被”底衬“挡在了身后,由于底衬的尺寸跟父窗体一般大,我们无法轻易找出子船体了,任凭你点坏鼠标恐怕也无能为力了!

        在这里我们可以用ZOrder方法。Z代表的是立体坐标系中Z轴,也就是跟窗体平面垂直的方向,这个方法在MDI窗体中决定某个谋子窗体在所有子窗体在Z轴的次序,最底层(object.Zorder 1 可使其置于最底层)or最上层(object.Zorder 0 可使其)。然后我们可以这样设置:在父窗体的Activate事件里让底衬窗体
写入代码 me.Zoder 1,这样在激活底衬窗体的时候,他就会处在子窗体的最底层,子窗体就不会消失了!

3.如果我们在操作过程中,加载子窗体的数目较多了,如果不随时关闭已有子窗体,他们就会一个个叠加在一块,弄得用户眼花缭乱,让操作有些繁琐。如果在打开心子窗体的同时能自动关闭或最小化已有窗体,就顺畅多了!在这里运用一下”遍历 窗体“ 的做法就OK了,先看一下代码:

Private Sub Form_Activate()
Dim a As Form
For Each a In Forms
   If a.Name <> Form1.Name And a.Name <> MDIForm1.Name And a.Name <> Me.Name Then
       a.WindowState = 1
       Form1.ZOrder 1
       End If
       Next

End Sub

       使用说明:在每一个子窗体的Activate(激活)事件里,加入这段代码

       作用原理:当某个子窗体激活的时候,对所有已加载的窗体进行一个判断,让除了自己、底衬窗体、主窗体以外的其他子窗体都最小化。

       大家都知道,当子窗体最小化的时候,会最小化为一个控制栏停靠在,父窗体的左下角。如果想恢复这个最小化的窗体,图方便可以电子控制栏的”恢复“图标,所以为防止这个控制栏又被底衬窗体挡住,最后又用了Zorder方法让底衬窗体老老实实呆在最底层! 我们如果在点击下拉菜单加载窗体的代码中 加入form.windowstate=0 (Normal) ,也可以让最小化的子窗体再次显示出来。这样我们就有两种恢复子窗体的方法了!

综合这四个小技巧,这样的MDI多窗体界面操作起来就相当的流畅了!

博客地址:http://blog.csdn.net/chenjinge7/article/

抱歉!评论已关闭.