一、 问题描述: 当向机房收费系统中添加了MDI窗体之后。设置其他的一些窗体做为父窗体的子窗体。(把窗体的MDIchild属性设置为true)。之后开始向主窗体添加图片啦。添加完毕后打算在主窗体上添加各种控件。就开始报错啦。如下图。
无法在窗体上添加command和textbox等无对齐属性的控件。之后用picturebox控件作为一个容器控件,让图片添加到picturebox控件上面。其他的控件就可以添加在picturebox控件上啦。紧接着问题又来了,运行通过代码 子窗体.show 。 却看不到子窗体显示出来。(其实并不是子窗体无法显示。而是子窗体和picturebox控件在这个条件下属于同一级别的。显示的子窗体被picturebox控件挡住啦。因此看不见)
二、解决方法:方法一:“借鸡下蛋”
既然MDI窗体上不能添加无对齐属性的控件。我们可以通过借助一个普通的窗体作为容器,把这些控件放置在这个普通窗体上。 ① 向工程中添加一个普通窗体,并将其MDIchild属性设置为True,把borderstyle属性设置为none(无边控)
②让主窗体加载的时候子窗体也跟着加载。子窗体的大小等于父窗体的大小。(如下图)
这样就可以在窗体中加载任何控件啦,同时避免了子窗体无法显示的问题。
方法二:“换父亲” 通过一个API函数:SetParent函数。该函数功能是改变某个子窗体的父窗体。
① 首先在模块中添加一个声明
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
② 参数 hWndChild:子窗口句柄。hWndNewParent:新的父窗口句柄。如果该参数是NULL,则桌面窗口就成为新的父窗口。
返回值:如果函数成功,返回值为子窗口的原父窗口的句柄:如果函数失败,返回值为Null
具体代码如下
PrivateSub RechargeMenu_Click() SetParentfrmRecharge.hwnd,frmMain.hwnd frmRecharge.Show End Sub这样就能让子窗体显示啦。
方法比较:方法一 优点: 一劳永逸,设置成功之后,以后每次显示子窗体的时候就不用设置啦。
缺点::个人感觉这种方法有点旁门左道
方法二 优点:通过一个API函数:GetParent函数,实现这些功能。API函数更符合大家的习惯。
缺点:每次子窗体显示的时候都需要输入重复的代码。有些繁琐。