;coded by UEZ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global Const $hGUI = GUICreate("Proportional Scale", 243, 170, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_THICKFRAME))
Global Const $idGroup = GUICtrlCreateGroup("Group1", 16, 8, 215, 150)
Global Const $idButton = GUICtrlCreateButton("Test", 50, 50, 50, 30)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP))
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
Global $aWS = WinGetPos($hGUI)
Global Const $ratio = $aWS[3] / $aWS[2]
Global Const $minSize = Int($aWS[2] * 0.75)
Global Const $maxSize = Int($aWS[2] * 2)
GUIRegisterMsg($WM_SIZING, "WM_SIZING")
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
Global $nMsg
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUIRegisterMsg($WM_SIZING, "")
GUIRegisterMsg($WM_GETMINMAXINFO, "")
GUIDelete($hGUI)
Exit
EndSwitch
WEnd
Func WM
_GETMINMAXINFO
($hWnd, $Msg, $wParam, $lParam)
Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
DllStructSetData($minmaxinfo, 7, $minSize) ; min X
DllStructSetData($minmaxinfo, 8, $minSize) ; min Y
DllStructSetData($minmaxinfo, 9, $maxSize) ; max X
DllStructSetData($minmaxinfo, 10, $maxSize) ; max Y
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_GETMINMAXINFO
Func WM
_SIZING
($hWnd, $iMsg, $wParam, $lParam)
Local $sRect = DllStructCreate("Int[4]", $lParam)
Local $left = DllStructGetData($sRect, 1, 1)
Local $top = DllStructGetData($sRect, 1, 2)
Local $right = DllStructGetData($sRect, 1, 3)
Local $bottom = DllStructGetData($sRect, 1, 4)
Switch $wParam ;drag side or corner
Case 1, 2, 4, 7
$iNewY = Int(($right - $left) * $ratio)
DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 2) + $iNewY, 4)
Case Else
$iNewX = Int(($bottom - $top) / $ratio)
DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 1) + $iNewX, 3)
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_SIZING