我是如下实现的,但效果不理想,不能在MDI父窗口上产生 最大/最小/关闭框
如果不用SetWindowLong设置为Child则两个窗体又不能融合。郁闷。。我的代码如下:
Public Sub SetFrmParent(HwndChildfrm As Long)
Dim lngRt As Long
If gHwndMDIfrm <> 0 Then
lngRt = SetWindowLong(HwndChildfrm, GWL_STYLE, WS_CHILD)
SetParent HwndChildfrm, gHwndMDIfrm
End If
End SubgHwndMDIfrm 是一个已知MDI窗体的句柄。
HwndChildfrm 是一个普通窗体句柄。
SetWindowLong 和 SetParent 是API函数
如果不用SetWindowLong设置为Child则两个窗体又不能融合。郁闷。。我的代码如下:
Public Sub SetFrmParent(HwndChildfrm As Long)
Dim lngRt As Long
If gHwndMDIfrm <> 0 Then
lngRt = SetWindowLong(HwndChildfrm, GWL_STYLE, WS_CHILD)
SetParent HwndChildfrm, gHwndMDIfrm
End If
End SubgHwndMDIfrm 是一个已知MDI窗体的句柄。
HwndChildfrm 是一个普通窗体句柄。
SetWindowLong 和 SetParent 是API函数
Private Sub Command2_Click()
Call SetParent(HwndChildfrm, gHwndMDIfrm)
Me.Move 0, 0
End Sub
我的意图是要将DLL中一个普通窗体通过动态的改变作为一个MDI窗体的子窗体。这个MDI窗体是在DLL外部的,我试了很多方法,都不能很好的表现为 象一个VB工程中的MDI窗体中打开子窗体那样(最大化时没有两个窗口标题条,关闭框等都在MDI窗体上等)。有没有熟悉Windows窗口创建过程的高手来指点一下。我周围的很多人都说不太可能实现,可我还是不太相信。
lngRt = SetWindowLong(HwndChildfrm, GWL_STYLE, WS_CHILD)修改了一下:
Public Sub SetFrmParent(HwndChildfrm As Long)
Dim lngRt As Long, old As Long, i As Long, j As Long
If gHwndMDIfrm <> 0 Then
j = SetWindowWord(HwndChildfrm, GWL_HWNDPARENT, gHwndMDIfrm)
old = GetWindowLong(HwndChildfrm, GWL_STYLE)
old = old Or WS_CHILD
lngRt = SetWindowLong(HwndChildfrm, GWL_STYLE, old)
SetParent HwndChildfrm, gHwndMDIfrm
i = SetWindowPos(HwndChildfrm, gHwndMDIfrm, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME)
End If
End Sub
另 :TO rainstormmaster(rainstormmaster)
你指出的问题,虽然这个问题在我发贴后就发现改正了,但还是要谢谢你
为什么要搞的那么 复杂呢????!!!!!
按你的方法加载完MDI子窗体后
怎样在MDI主窗体中得到子窗体的个数,以及让子窗体排列位置。