'窗体
Option Explicit
Private Sub Form_Load()
    Me.Width = 400 * 15
    Me.Height = 200 * 15
    Call SubClass(Me.hwnd)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Call UnSubClass(Me.hwnd)
End Sub'模块
Option Explicit
Public defWindowProc As Long
Public minX As Long
Public minY As Long
Public maxX As Long
Public maxY As LongPublic Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETMINMAXINFO As Long = &H24Public Type 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 Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" _
   (ByVal hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
   
Public Declare Function CallWindowProc Lib "user32" _
    Alias "CallWindowProcA" _
   (ByVal lpPrevWndFunc As Long, _
    ByVal hwnd As Long, _
    ByVal uMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As LongPublic Declare Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" _
   (hpvDest As Any, _
    hpvSource As Any, _
    ByVal cbCopy As Long)
Public Sub SubClass(hwnd As Long)   On Error Resume Next
   defWindowProc = SetWindowLong(hwnd, _
                                 GWL_WNDPROC, _
                                 AddressOf WindowProc)
   
End Sub
Public Sub UnSubClass(hwnd As Long)   If defWindowProc Then
      SetWindowLong hwnd, GWL_WNDPROC, defWindowProc
      defWindowProc = 0
   End If
   
End Sub
Public Function WindowProc(ByVal hwnd As Long, _
                           ByVal uMsg As Long, _
                           ByVal wParam As Long, _
                           ByVal lParam As Long) As Long         
         On Error Resume Next
          
         Select Case uMsg
            
            Case WM_GETMINMAXINFO
                 
                  Dim MMI As MINMAXINFO
                  
                  CopyMemory MMI, ByVal lParam, LenB(MMI)
      
                   With MMI
                      .ptMinTrackSize.x = 400
                      .ptMinTrackSize.y = 200
                      .ptMaxTrackSize.x = 400
                      .ptMaxTrackSize.y = 200
                  End With
      
                  CopyMemory ByVal lParam, MMI, LenB(MMI)
                 
                  WindowProc = 0
                    
              Case Else
              
                   WindowProc = CallWindowProc(defWindowProc, _
                                               hwnd, _
                                               uMsg, _
                                               wParam, _
                                               lParam)
                  
          End Select
   
End Function

解决方案 »

  1.   

    该问题的最底层答案:通过SetWindowLong设置窗口风格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 GWL_STYLE = (-16)Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_THICKFRAME = &H40000
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPrivate Const SC_MAXIMIZE = &HF030&Private Const MF_BYCOMMAND = &H0&Private Sub Form_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
        
        TempLng = GetSystemMenu(Me.hWnd, 0)
        DeleteMenu TempLng, SC_MAXIMIZE, MF_BYCOMMAND
        
    End Sub
      

  2.   

    其实设置BoarderStyle和ControlBox属性跟调用API是一回事。