#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $k = 0, $TrMg = 0
$Gui = GUICreate("Измени размер окна", 370, 270, -1, -1, $WS_OVERLAPPEDWINDOW)
$Label = GUICtrlCreateLabel('Функция WM_SIZING выполняется при изменении размеров окна. Отличается от WM_SIZE тем, что выполняется при нажатии и отпуске границ окна. Предполагается использовать для установки положения и размеров некоторых элементов интерфейса в момент изменения размеров окна, в случае особых правил отсутствующих в GUICtrlSetResizing', 5, 5, 360, 230)
$Checkbox = GUICtrlCreateCheckbox('Пропорциональное изменение', 10, 240, 190, 17)

GUISetState()

Global $HtoW
; $gp = WinGetPos($Gui)
; Global $HtoW = $gp[3] / $gp[2]
GUIRegisterMsg($WM_SIZING, "WM_SIZING")

While 1
	$msg = GUIGetMsg()

	Switch $msg
		Case $Checkbox
			If GUICtrlRead($Checkbox) = 1 Then
				$TrMg = 1
				$gp = WinGetPos($Gui)
				$HtoW = $gp[3] / $gp[2]
			Else
				$TrMg = 0
			EndIf
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_SIZING($hWnd, $iMsg, $wparam, $lparam)
	; получает координаты сторон окна
	Local $sRect = DllStructCreate("Int[4]", $lparam), _
			$left = DllStructGetData($sRect, 1, 1), _
			$top = DllStructGetData($sRect, 1, 2), _
			$Right = DllStructGetData($sRect, 1, 3), _
			$bottom = DllStructGetData($sRect, 1, 4)
	$w = $Right - $left
	$h = $bottom - $top

	$k += 1
	WinSetTitle($Gui, '', 'Вызов ' & $k & ' раз, w=' & $w & ', h=' & $h)
	
	GUICtrlSetData($Label, 'Вызов ' & $k & ' раз' & @CRLF & @CRLF & _
		'--- Границы окна ---' & @CRLF & _
		'Левая граница = ' & @TAB & $left & @CRLF & _
		'Верхняя граница = ' & @TAB & $top & @CRLF & _
		'Правая граница = ' & @TAB & $Right & @CRLF & _
		'Нижняя граница = ' & @TAB & $bottom & @CRLF & @CRLF & _
		'--- Размеры окна ---' & @CRLF & _
		'Ширина = ' & @TAB & $w & @CRLF & _
		'Высота = ' & @TAB & $h & @CRLF & @CRLF & _
		'--- Граница или угол захвата мышкой ---' & @CRLF & _
		'$wparam = ' & @TAB & $wparam)
	If $TrMg = 1 Then
		Switch $wparam
			Case 1, 2
				$newHt = ($Right - $left) * $HtoW
				DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 2) + $newHt, 4)
			Case Else
				$newWid = ($bottom - $top) / $HtoW
				DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 1) + $newWid, 3)
		EndSwitch
	EndIf

	Return $GUI_RUNDEFMSG
EndFunc