如何使一个mdi的子窗口在显示的时候位于主窗口的中央,如何使窗口的大小不能改变,
我定义的许多mdi的子窗口,在设计时,固定了大小,正好包括了窗口上的所有控件,但在运行的时候,窗口大小或者变大,或者变小。使很多窗口上的东西显示不出来。这是什么原因

解决方案 »

  1.   

    设置窗口的Borderstyle = 1(或者其它不可改变大小的边框)Private Sub Form_Load()
        Me.Move (mdifrm.Width - Me.Width) / 2, (mdifrm.Height - Me.Height) / 2
    End Sub
      

  2.   

    Private Sub Form_Load()
        Me.Move (mdifrm.Width - Me.Width) / 2, (mdifrm.Height - Me.Height) / 2
    End Sub
    '在改变大小时再触发一个事件
    Private Sub Form_Resize()
    Me.Move (mdifrm.Width - Me.Width) / 2, (mdifrm.Height - Me.Height) / 2
    Me.Width=你要的宽度
    Me.Height=你要的高度
    End Sub
      

  3.   

    同意楼上的,补充一点,MDI窗体在载入子窗体时,自动更改了高度,你可以在子窗体的load事件中添加1。2。
    1  Me.Height=XXX(预先设置的)  
       Me.width=XXX
    或者你用Borderstyle=1试试,我试过好象不行的。
    2  Me.Move (mdifrm.Width - Me.Width) / 2, (mdifrm.Height - Me.Height) / 2
      

  4.   

    不是吧,我和wea1978(川) 居然同时发贴!!!
      

  5.   

    呵呵怎么会,你比你早1分钟呢,不错,你的方法有道理,不过在LOAD的时候加载的是在设计时做好的宽,高,所以可不必去重新设置
      

  6.   

    wea1978(川) 有理,同意你的看法!  楼主,可以结贴了!
      

  7.   

    就算是限制可以改变大小的子窗口也绝不能在RESIZE事件里写,这样在改变大小的时候会发生严重的闪烁,不信大家可以试一下!!
    如果要限制可以:模块中:Option ExplicitDeclare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_GETMINMAXINFO = &H24
    Public OldWindowProc As LongType POINTAPI
         x As Long
         y As Long
    End TypeType MINMAXINFO
        ptReserved As POINTAPI
        ptMaxSize As POINTAPI
        ptMaxPosition As POINTAPI
        ptMinTrackSize As POINTAPI
        ptMaxTrackSize As POINTAPI
    End TypePublic Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
        If Msg = WM_GETMINMAXINFO Then
            Dim MinMax As MINMAXINFO
            
            CopyMemory MinMax, ByVal lp, Len(MinMax)
            
            MinMax.ptMinTrackSize.x = 300
            MinMax.ptMinTrackSize.y = 200
            
            MinMax.ptMaxTrackSize.x = 640
            MinMax.ptMaxTrackSize.y = 480
            
            CopyMemory ByVal lp, MinMax, Len(MinMax)
            
            WndProc = 1
            Exit Function
        End If
        WndProc = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
    End Function限制大小的窗口中:Option ExplicitPrivate Sub Form_Load()
        'w = 200: h = 100
        OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
        Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)
    End Sub
      

  8.   

    To: cuizm(射天狼)
    请问怎么不能在Resize里面做事件呢?我还不明白呢,可以说它影响的是什么吗?闪烁?好象是有,不过在一般的情况下是不会的,多谢cuizm(射天狼)提醒,我也看看能不能用你的模块代替。
      

  9.   

    哦,对了,我觉得如果要限制它改变大小,就把form的Borderstyle属性设置为3(fixed dialong),这样就不用写代码,也不允许操作者改变大小.在LOAD里面调整位置就行了。