用下面的代码可以实现调用外部程序作为MDI子窗体,那么如何实现,调用的程序无边框、不能移动、在MDI托盘内平铺显示呢?
Option Explicit
Private Declare Function SetParent Lib "user32.dll" ( _
     ByVal hWndChild As Long, _
     ByVal hWndNewParent As Long) As Long     
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As LongPrivate Const WS_EX_MDICHILD As Long = &H40&
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE As Long = (-20)
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)'把计算器作为子窗体
Private Sub MDIForm_Load()
    Dim lngCalculator As Long    
    Dim lngStyle As Long
    Dim lngExStyle As Long    
    Shell "calc.exe", vbNormalFocus    
    lngCalculator = FindWindow(vbNullString, "计算器")    
    If lngCalculator > 0 Then
        SetParent lngCalculator, Me.hwnd
        SetWindowLong lngCalculator, GWL_EXSTYLE, WS_EX_MDICHILD
    End If
End Sub

解决方案 »

  1.   

    Private Declare Function SetParent Lib "user32.dll" ( _
         ByVal hWndChild As Long, _
         ByVal hWndNewParent As Long) As Long
    Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
         ByVal hwnd As Long, _
         ByVal nIndex As Long, _
         ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
         ByVal lpClassName As String, _
         ByVal lpWindowName As String) As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Const WS_EX_MDICHILD As Long = &H40&
    Private Const GWL_STYLE = (-16)
    Private Const GWL_EXSTYLE As Long = (-20)
    Private Const WS_CHILD = &H40000000
    Private Const WS_CHILDWINDOW = (WS_CHILD)
    Private Const SWP_NOMOVE = &H2
    Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As rect) As Long
    Private Type rect
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    Private rect As rect
    Private Const SWP_SHOWWINDOW = &H40
    '把计算器作为子窗体
    Private Sub MDIForm_Load()
        
        Dim lngCalculator As Long
        Dim lngStyle As Long
        Dim lngExStyle As Long
        Me.Show
        Form2.BorderStyle = 0
        Form2.Show
        GetClientRect Me.hwnd, rect         '获取当前窗体的客户区域大小
    '    Shell "calc.exe", vbNormalFocus
    '    lngCalculator = FindWindow(vbNullString, "计算器")
        lngCalculator = Form2.hwnd
        If lngCalculator > 0 Then
            SetParent lngCalculator, Me.hwnd
            SetWindowLong lngCalculator, GWL_EXSTYLE, WS_EX_MDICHILD
            SetWindowPos lngCalculator, 0, 0, 0, rect.Right - rect.Left, _
                            rect.Bottom - rect.Top, SWP_SHOWWINDOW         '设置窗体大小和位置
            
        End If
    End Sub