MDI窗体是个很变态的东西,你说的这些都能做到,就是有一点,双击标题栏我到现在还是没有找到办法解决(当然除了子类技术)

解决方案 »

  1.   

    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Private Const GWL_STYLE = (-16)
    Private Const WS_THICKFRAME = &H40000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_MAXIMIZEBOX = &H10000
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    '
    Const MF_BYPOSITION = &H400&
    Const MF_REMOVE = &H1000&
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
        Dim hSysMenu As Long, nCnt As Long
        hSysMenu = GetSystemMenu(Me.hwnd, False)
        If hSysMenu Then
            nCnt = GetMenuItemCount(hSysMenu)
            If nCnt Then
                RemoveMenu hSysMenu, nCnt - 3, MF_BYPOSITION Or MF_REMOVE
                RemoveMenu hSysMenu, nCnt, MF_BYPOSITION Or MF_REMOVE
                DrawMenuBar Me.hwnd
            End If
        End If
        SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) Xor _
                                  (WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
        GetSystemMenu Me.hwnd, 1&
        SetWindowLong Me.hwnd, GWL_STYLE, MY_DIALOG这个应该可以解决不少问题,你试试吧
      

  2.   

    对了,忘了说 Dim hSysMenu As Long, nCnt As Long
        hSysMenu = GetSystemMenu(Me.hwnd, False)
        If hSysMenu Then
            nCnt = GetMenuItemCount(hSysMenu)
            If nCnt Then
                RemoveMenu hSysMenu, nCnt - 3, MF_BYPOSITION Or MF_REMOVE
                RemoveMenu hSysMenu, nCnt, MF_BYPOSITION Or MF_REMOVE
                DrawMenuBar Me.hwnd
            End If
        End If
        SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) Xor _
                                  (WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
        GetSystemMenu Me.hwnd, 1&
        SetWindowLong Me.hwnd, GWL_STYLE, MY_DIALOG这部分放在FORM_LOAD中
      

  3.   

    to holydiablo(鱼头)
    MY_DIALOG   这个怎么定义呀。
      

  4.   

    Option Explicit
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_THICKFRAME = &H40000Private Const GWL_STYLE = (-16)Private Sub MDIForm_Load()
        Dim TempLng As Long
        
        TempLng = GetWindowLong(Me.hwnd, GWL_STYLE)
        TempLng = TempLng And Not WS_MINIMIZEBOX '隐藏最小化
        TempLng = TempLng And Not WS_MAXIMIZEBOX '禁用最大化
        TempLng = TempLng And Not WS_THICKFRAME '禁用可改变大小的边框
        SetWindowLong Me.hwnd, GWL_STYLE, TempLng
        
    End Sub
      

  5.   

    个人认为鱼头的做法比较标准,zyl910 做法只是去除了标题框,没有在系统菜单中去掉,仍然可以最大化最小化还原等操作,我想如果把两个方法合起来一起用应该比较完美
      

  6.   

    Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    '取得指定窗口的系统菜单的句柄
    Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    '删除指定的菜单条目
    Public Const MF_BYPOSITION = &H400&