问题见标题

解决方案 »

  1.   

    以前写的一个,(不知道有没有必要加到blog里去)'新建EXE工程'把Form1改成MDI子窗口;添加一个按钮,Command1;调整窗口大小;加入以下代码:Option ExplicitPrivate Sub Command1_Click()
      MsgBox "按钮!"
    End SubPrivate Sub Form_Load()
      MdiChildOnBottomSet Me.hwnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
      MdiChildOnBottomReset Me.hwnd
    End Sub'创建一个MDI子窗口,Form2;'创建一个MDI父窗口;加入以下代码:Option ExplicitPrivate Sub MDIForm_Click()
      Dim fm As Form2
      Set fm = New Form2
      fm.Show
    End Sub'添加一个模块,Module1;加入以下代码:Option ExplicitPrivate Const WM_WINDOWPOSCHANGED = &H47
    Private Const WM_WINDOWPOSCHANGING = &H46
    Private Type WINDOWPOS
            hwnd As Long
            hWndInsertAfter As Long
            x As Long
            y As Long
            cx As Long
            cy As Long
            flags As Long
    End Type
    Private Const SWP_NOZORDER = &H4
    Private Const HWND_BOTTOM = 1&
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Const GWL_WNDPROC = (-4&)
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private 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 Long
    Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
    Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Const PROP_OLDPROC = "MdiChildOnBottom_OldWndProc"
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Sub MdiChildOnBottomSet(ByVal hwnd As Long)
      Dim oProc As Long
      oProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf MdiChildOnBottomWndProc)
      If oProc Then
        SetProp hwnd, PROP_OLDPROC, oProc
      End If
    End SubPublic Sub MdiChildOnBottomReset(ByVal hwnd As Long)
      Dim lpProc As Long
      lpProc = GetProp(hwnd, PROP_OLDPROC)
      If lpProc Then
        SetWindowLong hwnd, GWL_WNDPROC, lpProc
      End If
      RemoveProp hwnd, PROP_OLDPROC
    End SubPrivate Function MdiChildOnBottomWndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Dim wpos As WINDOWPOS, oProc As Long
      Select Case uMsg
      Case WM_WINDOWPOSCHANGING
        CopyMemory wpos, ByVal lParam, LenB(wpos)
        wpos.hWndInsertAfter = HWND_BOTTOM
        wpos.flags = wpos.flags And (Not SWP_NOZORDER)
        CopyMemory ByVal lParam, wpos, LenB(wpos)
      End Select
      oProc = GetProp(hwnd, PROP_OLDPROC)
      If oProc Then
        MdiChildOnBottomWndProc = CallWindowProc(oProc, hwnd, uMsg, wParam, lParam)
      Else
        MdiChildOnBottomWndProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
      End If
    End Function'运行。
    'Form1自动创建。点击父窗口来创建Form2。
    '但Form1始终在最下面,并且可以获得焦点。