各位高手好,如题,
最常见的方法是
在 resize事件中,加入
 if me.width < 3000 then me.width = 3000可是这样写的在改变窗体大小的时候,窗体总在闪,
有没有别的方法 比较正规的。
比如鼠标拖到最小的范围后,鼠标本身就不能再往小的方向移动了。
或有其它什么好的方法谢谢

解决方案 »

  1.   

    '以下程式在module1.bas
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"  (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA"  (ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic 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 LongPublic 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 Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
       lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Public Const GWL_WNDPROC = (-4)
    Public Const WM_GETMINMAXINFO = &H24Public Type POINTAPI
            x As Long
            y As Long
     End TypePublic Type MINMAXINFO
            ptReserved As POINTAPI
            ptMaxSize As POINTAPI
            ptMaxPosition As POINTAPI
            ptMinTrackSize As POINTAPI
            ptMaxTrackSize As POINTAPI
     End Type
     
    Public preWinProc As Long
    Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim lwd As Long, hwd As Long
        If Msg = WM_GETMINMAXINFO Then
             Dim maxmin As MINMAXINFO
             CopyMemory maxmin, ByVal lParam, Len(maxmin)
             maxmin.ptMaxTrackSize.x = 500 '设定最大Resize的宽度
             maxmin.ptMaxTrackSize.y = 400 '设定最大Resize的高度
             maxmin.ptMinTrackSize.x = 300 '设定最大小Resize的宽度
             maxmin.ptMinTrackSize.y = 300 '设定最大小Resize的高度
             CopyMemory ByVal lParam, maxmin, Len(maxmin)
             wndproc = DefWindowProc(hwnd, Msg, wParam, lParam) 
        Else
             '将之送往原来的Window Procedure
             wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
        End If
    End Function
     
    --------------------------------------------------------------------------------
    '以下在Form
    Private Sub Form_Load()
        Dim ret As Long
        '记录原本的Window Procedure的位址
        preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
        ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
    End Sub Private Sub Form_Unload(Cancel As Integer)
        Dim ret As Long
        '取消Message的截取,而使之又只送往原来的Window Procedure
        ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
     End Sub