做机房收费系统时,我会遇到这样一个问题:在父窗体上无法添加label,text或者是commandbutton等这些控件。
那是因为只有具有Align或者是不可见的控件(如timer)才可以直接放到mdi的主窗体上。因为mdi是其它子窗体的容器。如果能放置按钮的话,那么显示子窗体的时候按钮将会被盖住。可以先在mdi上放置一个具有Align属性的控件。例如PictureBox,再把按钮放到PictureBox上。这样才可以间接的把按钮放到mdi主窗体上。
其中Align属性:返回或设置一个值,确定对象是否可在窗体上以任意大小、在任意位置上显示,或是显示在窗体的顶端、底端、左边或右边,而且自动改变大小以适合窗体的宽度。对象在MDI窗体的缺省值是在顶部,其宽度等于窗体的 ScaleWidth 属性设置值。
PictureBox 和 Data 控件是唯一能放在 MDI 窗体上的标准控件。MDI窗体的内部区域定义为没有被控件覆盖的空间。当 MDI 子窗体在 MDI 父窗体中最大化时,它不会覆盖任何控件。
但是如果将picturebox拉伸到与mdi窗体最大化时一样大小时,子窗体就无法显示了。那么怎么解决这个问题呢?
我用到了API函数----SetParent
声明方法:
Private Declare FunctionSetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParentAs Long) As Long
函数功能:该函数改变某个子窗口的父窗口。
参数:
hWndChild:子窗口句柄。hWndNewParent:新的父窗口句柄。如果该参数是NULL,则桌面窗口就成为新的父窗口。
返回值:如果函数成功,返回值为子窗口的原父窗口句柄;如果函数失败,返回值为NULL。
具体代码是:
PrivateSub RechargeMenu_Click()
SetParentfrmRecharge.hWnd, frmMain.hWnd
frmRecharge.Show
End Sub