我是如下实现的,但效果不理想,不能在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函数

解决方案 »

  1.   

    Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Private Sub Command2_Click()
        Call SetParent(HwndChildfrm, gHwndMDIfrm)
        Me.Move 0, 0
    End Sub
      

  2.   

    sxfzu(Flying) 没理解我的意图。
    我的意图是要将DLL中一个普通窗体通过动态的改变作为一个MDI窗体的子窗体。这个MDI窗体是在DLL外部的,我试了很多方法,都不能很好的表现为 象一个VB工程中的MDI窗体中打开子窗体那样(最大化时没有两个窗口标题条,关闭框等都在MDI窗体上等)。有没有熟悉Windows窗口创建过程的高手来指点一下。我周围的很多人都说不太可能实现,可我还是不太相信。
      

  3.   

    试了一会,确实没有什么好的办法,不过要指出的是你给出的程序存在问题是这一句:
    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
      

  4.   

    看看CreateMDIWindow这个API是否用得着。
      

  5.   

    似乎真的没办法了,前两天我研究了一下WINDOW的窗口,在《MS WIN32程序员参考大全(一)》中说当在多线程中,创建MDI子窗体时必须用CreateMDIWindow函数创建,但是在VB中普通窗体可以肯定不是用它来创建的(估计当窗体中MDICHILD属性为TRUE时用它来创建),我们在运行时访问窗体时,VB就自动的创建了窗体了。不知道有没有办法在它之前就创建,或者自己再重新用CreateMDIWindow创建一个同样的窗体!(浪费内存也不管了)  大家认为这条路的可行性怎样?
    另 :TO  rainstormmaster(rainstormmaster) 
    你指出的问题,虽然这个问题在我发贴后就发现改正了,但还是要谢谢你
      

  6.   

    //用CreateMDIWindow创建一个同样的窗体这个可以实现,问题是从窗体到控件都需要由程序生成,还要结合子类处理处理事件,这个是不是有点得不偿失。
      

  7.   

    在设计模式下将 窗体的MDIChild 属性设置成True,不就一切搞定了吗???!!!!
    为什么要搞的那么 复杂呢????!!!!!
      

  8.   

    楼上的没细看我的要求,窗体是封装在DLL中的,不能用MDIChild 属性
      

  9.   

    在DLL设计时把MDIChild设为TRUE怎么样?
      

  10.   

    wangyy123 (wyy) 
    按你的方法加载完MDI子窗体后
    怎样在MDI主窗体中得到子窗体的个数,以及让子窗体排列位置。