Public g_lngDefWindowProc As Long
Public g_lngMinX As Long
Public g_lngMinY As Long
Public g_lngMaxX As Long
Public g_lngMaxY As Long
Public p_Form As Form
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETMINMAXINFO As Long = &H24
Public Type POINTAPI
x As Long
y As Long
End Type
Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const GWL_STYLE = (-16)
Public Const WS_MAXIMIZE = &H1000000
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public 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 Long
Public 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
g_lngDefWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnSubClass(hwnd As Long)
If g_lngDefWindowProc Then
SetWindowLong hwnd, GWL_WNDPROC, g_lngDefWindowProc
g_lngDefWindowProc = 0
End If
End Sub
Public Function WindowProc(ByVal p_lngHwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim udtMMI As MINMAXINFO
On Error Resume Next
Select Case p_lngHwnd
Case p_Form.hwnd
Select Case uMsg
Case WM_GETMINMAXINFO
CopyMemory udtMMI, ByVal lParam, LenB(udtMMI)
'set the MINMAXINFO data to the
'minimum and maximum values set
'by the option choice
With udtMMI
.ptMinTrackSize.x = g_lngMinX
.ptMinTrackSize.y = g_lngMinY
.ptMaxTrackSize.x = g_lngMaxX
.ptMaxTrackSize.y = g_lngMaxY
End With
CopyMemory ByVal lParam, udtMMI, LenB(udtMMI)
'according to MSDN we have to return 0 if we
'processed the message ourselves
WindowProc = 0
Case Else
'take care of other messages
WindowProc = CallWindowProc(g_lngDefWindowProc, p_lngHwnd, uMsg, wParam, lParam)
End Select
End Select
End Function