做好菜单栏后,发现多文档界面不允许添加标签和文本框之类的控件,只能够借助于picture box 作为载体来添加。但是这样那些子窗体显示的时候就会被图片框给覆盖。还有一种方法就是另外在增加一个子窗体来显示让图片框上的内容。但是考虑到用户,个人觉得还是一个窗体操作起来更直观,方便。
为了可以让我的那些子窗体在父窗体中显示,setparent 函数被找到了。
setparent
声明方法:
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
函数功能:
该函数改变某个子窗口的父窗口。
函数原型:HWND SetParent(HWND hWndChild,HWND hWndNewParent)。
参数解释:第一个参数 hwndchild 是子窗体句柄,第二个参数 hwndnewparent 是父窗口句柄。
具体使用:在模块中声明setparent函数。然后在要成为子窗体的窗体加载事件中写入:
Call SetParent(Me.hwnd, frmmain.Picmain.hwnd)
Me.WindowState = 2
这样子窗体就可以在父窗体中显示出来了。可能有的人的的子窗体显示出来了,可是使用不了,也就是说无法获得焦点。这个时候就要注意了。看看你的子窗体的MDIchild 属性是不是为false 。 不是的话改为默认的false,然后再试。
再看setparent 函数
这个函数其实是很有意思的。首先看名字:set——parent 。用编程语言字面理解应该是 安排——容器。具体点就是给一个窗体安排放置它的容器。所以A ,B 窗体之前是没有从属关系的。我们要想让A窗体放置到B窗体中无需先让A 成为B 子窗体。我们只需要使用上边的两行代码就可以了。
其次是参数:hwndchild 和hwndnewparent 不光指的是窗体,也可以是控件。当然这个hWndNewParent应该是一个容器控件。不知道大家有没有发现在这个例子中:我的父窗口句柄用的是:
frmmain.Picmain.hwnd。其实这是一个容器控件picturebox 的句柄。在这个系统中,我需要的就是把我的子窗体放到父窗体的的图片框中显示,所以父窗口句柄是:frmmain.picmain.hwnd。
再次看setparent 函数就有了这个额为的发现:给控件设置容器控件;
给空间设置窗体;
给窗体设置父窗体;
还可以把窗体放到容器控件中。
怎么样?是不是发现这个setparent 函数的功能很多呢?