MDI窗体是多文档窗体,相应来说就有单文档窗体,多文档窗体就像一个Excel工作薄可以有多个工作表一样,它可以拥有多个子窗体。使用的时候多文档窗体会相对来说比单文档窗体多一些限制,比如不能在MDI窗体上加载没有对齐属性的控件,这就需要用到容器控件。可以使用PictureBox控件来弥补,但是加载子窗体时图片框控件会覆盖子窗体。如果单纯的解决这个问题,而不顾及机房收费系统的窗体效果,有以下几种解决方法:
一、将图片框置后
从理论上讲,图片框之所以会影响子窗体的加载是因为图片框的位置是在前面的,所以会覆盖子窗体。那么就可以通过加载子窗体时使图片框位置置后就可以解决了,但是在网上搜到的一些代码实现不了,所以这种方法被我放弃了,但是我一直觉得它应该也是可以的,继续研究吧。
二、利用SetParent函数
SetParent函数可以用来改变某个子窗体的父窗体,也就是说可以设置某一个窗体的父窗体是谁。API函数首先是声明,
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long,ByVal hWndNewParent As Long) As Long
调用函数时,
SetParent Form1.hWnd,frmMain.hWndForm1表示要进行设置的窗体,frmMain表示要设置成父窗体的窗体。
但是用这个方法的时候还是出现了一个问题,那就是窗体最小化时就不见了,其实还是被图片框覆盖着的。
三、不用MDI窗体,直接在普通窗体上使用SetParent函数
这就是说直接用SetParent函数将一个普通窗体设置成其它窗体的父窗体,但是最小化是却跑到了桌面的任务栏里面,而不是存在于子窗体的下方,于是这个方法也被我废掉了。
四、还是利用SetParent函数,但是改变以下父窗体
其实一直出现的问题都是子窗体被图片框覆盖了,那么为什么不能将图片框设置成承载子窗体的容器呢?于是代码就变成了这样:
SetParent Form1.hWnd,Picture1.hWndForm1同样是代表要设置为子窗体的窗体, 再适当的调一下窗体的大小,这样就可以实现系统本身的效果了。至于重复调用的窗体,比如在主窗体中可以调用“学生上机统计信息查询”窗体,在“学生上机状态查看”中同样会调用这个窗体,那其实就将容器代码的格式换一下就行了,
SetParent Form1.hWnd,frmMain.Picture1.hWnd
一个问题有很多中解决方法,也就看自己需要实现那种效果。不同的方法也只有自己试过才知道是不是自己想要的,只这一个问题解决了两天,现在看来也没有浪费时间。