Determine maximum size and the position of a maximized form

Determine maximum size and the position of a maximized form

When the user resizes a form with the mouse or the keyboard, or maximizes it, Windows sends the form a WM_GETMINMAXINFO message, with lParam pointing to a MINMAXINFO structure that the form must fill with information about the minimum and maximum size that it is willing to be resized. Using a subclassing technique you can trap this message and fill the structure yourself, instead of letting VB fill it with default values.

The following example shows how you can prevent a form from being resized larger than 600×400 pixels, and smaller than 300×200 pixels. Moreover, when the form is maximized, it will be centered on the screen:

' REQUIRES THE MSGHOOK.DLL COMPONENT'Const WM_GETMINMAXINFO = &H24Private Type POINTAPI    X As Long    Y As LongEnd TypePrivate Type MINMAXINFO    ptReserved As POINTAPI    ptMaxSize As POINTAPI    ptMaxPosition As POINTAPI    ptMinTrackSize As POINTAPI    ptMaxTrackSize As POINTAPIEnd TypeDeclare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, _    source As Any, ByVal numBytes As Long)Dim WithEvents FormHook As MsgHookPrivate Sub Form_Load()    ' start form subclassing     Set FormHook = New MsgHook    FormHook.StartSubclass hWndEnd SubPrivate Sub FormHook_AfterMessage(ByVal uMsg As Long, ByVal wParam As Long, _    ByVal lParam As Long, retValue As Long)    If uMsg = WM_GETMINMAXINFO Then        ' Windows is querying the form for its        ' minimum and maximum size and position.        Dim mmInfo As MINMAXINFO        ' Read contents of structure pointed to by lParam.        CopyMemory mmInfo, ByVal lParam, Len(mmInfo)        With mmInfo            ' ptMaxSize is the size of the maximized form.            .ptMaxSize.X = 600            .ptMaxSize.Y = 400            ' ptMaxPosition is the position of the maximized form.            .ptMaxPosition.X = ((Screen.Width / Screen.TwipsPerPixelX) - 600)  _                2            .ptMaxPosition.Y = ((Screen.Height / Screen.TwipsPerPixelY) - 400)  _                2            ' ptMinTrackSize is the minimum size of a form when resizing with             ' the mouse.            .ptMinTrackSize.X = 300            .ptMinTrackSize.Y = 200            ' ptMinTrackSize is the maximum size of a form when resizing with             ' the mouse.            ' (It is usually equal to ptMaxSize.)            .ptMaxTrackSize.X = 600            .ptMaxTrackSize.Y = 400        End With        ' Copy back in the original structure in memory.        CopyMemory ByVal lParam, mmInfo, Len(mmInfo)        ' Must return zero to inform that the structure has been modified.        retValue = 0    End IfEnd Sub


Share the Post: