建了一个form,可以resize的,但我不想它小于某个大小,比如width 不能小于200,height不能小于150

解决方案 »

  1.   

    '窗体
    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 = 500
                          .ptMaxTrackSize.y = 300
                      End With
          
                      CopyMemory ByVal lParam, MMI, LenB(MMI)
                     
                      WindowProc = 0
                        
                  Case Else
                  
                       WindowProc = CallWindowProc(defWindowProc, _
                                                   hwnd, _
                                                   uMsg, _
                                                   wParam, _
                                                   lParam)
                      
              End Select
       
    End Function