Что нового

[Элементы GUI] Алгоритм ф-ии GUICtrlSetResizing ( controlID, $GUI_DOCKWIDTH)?

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Каков алгоритм ф-ии
Код:
GUICtrlSetResizing ( controlID, $GUI_DOCKWIDTH)
при изменении ширины окна ?
X эл-та = Func (WinWidth)
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

$h_Form = GUICreate("", 800, 200, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)

$_Lab1=GUICtrlCreateLabel( '', 10, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$_Lab2=GUICtrlCreateLabel( '', 490, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)


GUISetState()
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	Local $w, $h
	$w = BitAND($lParam, 0xFFFF)
	$h = BitShift($lParam, 16)
	
	$aPos=ControlGetPos($h_Form, '', $_Lab1)
	$sText="$w= " & $w & @CRLF & "$xLab1= " & $aPos[0]
	GUICtrlSetData($_Lab1, $sText)
	
	$aPos=ControlGetPos($h_Form, '', $_Lab2)
	$sText="$w= " & $w & @CRLF & "$xLab2= " & $aPos[0]
	GUICtrlSetData($_Lab2, $sText)
	
	Return $GUI_RUNDEFMSG
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
С чем связан пример? Он выводит ширину клиентской области окна и левый отступ элементов.
$GUI_DOCKWIDTH - ширина не изменяется
В чём вопрос?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
С чем связан пример?

Нужна формула изменения значения этого отступа (в зависимости от изменения ширины окна)

Для левого элемента это скажем
Код:
$x =$x* $WinWidth/$WinWidth_Default
, Для правого : зеркально
Нужна универсальная (что-то в ступор вошел )
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
"Новый отступ" = "отступ" * "новая ширина окна" / "ширина окна"
Обычная пропорция. Если окно увеличилось в 2 раза, то и отступ увеличивается в 2 раза.
w1/w2 = z1/z2
отступ новый / отступ старый = ширина новая / ширина старая.
Дробь можно переворачивать сразу обе и переносить из левой в правую часть и наоборот. Если в левой это делитель, то в правой он уже множитель. Если в левой делимое, то в правой, то же делимое.
;D
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Обычная пропорция. Если окно увеличилось в 2 раза, то и отступ увеличивается в 2 раза.
Не совсем так.
Для показанного примера увеличим ширину окна в 2 раза (1600)

Получи новые значения :
Код:
$xLab1= 10*1600/800    ;  20  верно

$xLab2=490 *1600/800  ;  Здесь уже та ф-ла даст   980 , что неверно (должно быть 1280 см. пример)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Оно либо взависимости от ширины, либо 1280, что-то одно. Я пока не разгадал суть вопроса.

Суть вопроса :
Нужна ф-ла для перемещения элементов , созданных с помощью UDF
Пример 2.
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
#include <EditConstants.au3>

Global $aArray[3][2]

$h_Form = GUICreate("", 800, 200, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)

$_Lab1=GUICtrlCreateLabel( '', 10, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$_Lab2=GUICtrlCreateLabel( '', 490, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$h_Edit1=_GUICtrlEdit_Create($h_Form, '', 10, 120, 300, 20, $ES_AUTOHSCROLL+$ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)
$h_Edit2=_GUICtrlEdit_Create($h_Form, '', 490, 120, 300, 20, $ES_AUTOHSCROLL+$ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)


$aArray[1][0]=$h_Edit1
$aArray[1][1]=10
$aArray[2][0]=$h_Edit2
$aArray[2][1]=490

GUISetState()
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	Local $w, $h
	$w = BitAND($lParam, 0xFFFF)
	$h = BitShift($lParam, 16)
	
	$aPos=ControlGetPos($h_Form, '', $_Lab1)
	$sText="$w= " & $w & @CRLF & "$xLab1= " & $aPos[0]
	GUICtrlSetData($_Lab1, $sText)
	
	$aPos=ControlGetPos($h_Form, '', $_Lab2)
	$sText="$w= " & $w & @CRLF & "$xLab2= " & $aPos[0]
	GUICtrlSetData($_Lab2, $sText)
	
	
	For $i = 1 To 2
	     $x=$aArray[$i][1]* $w/800; ?????????   Нужна универсальная ф-ла
	     ControlMove($h_Form, "",$aArray[$i][0],  $x, Default)
	     ControlSetText ($h_Form, "",$aArray[$i][0],  Floor($x))
  Next
	
	Return $GUI_RUNDEFMSG
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz

_GUICtrlEdit_Create возвращает дескриптор, его ни как в ControlMove нельзя использовать. Надо _WinAPI_MoveWindow. То есть нужно сделать такое же поведение как у Label? Там как бы сумма поведений:
По умолчанию стиль изменения размеров $GUI_DOCKAUTO (размер и позиция изменяются пропорционально).
К этому добавлено "не изменять ширину" и ко всему этому добавлено установка ControlGetPos. Проще описать словами, как должен двигаться элемент.
Причём ControlGetPos применяется к Label без формулы, а к _GUICtrlEdit_Create с формулой. Поведение их соответствует установленному, то есть он не будет двигаться как Label потому что ширина не вычисляется, и соответственно выпадает за пределы окна.
1. Левая сторона должна быть пропорциональна или с отступом от левого края? В общем требуется указать какие флаги исползуются, как бы из GUICtrlSetResizing и тогда можно будет писать формулу.
Формала под $GUI_DOCKWIDTH вообще не требуется, это установка ширины, она не меняется.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
1. Левая сторона должна быть пропорциональна или с отступом от левого края? В общем требуется указать какие флаги исползуются, как бы из GUICtrlSetResizing и тогда можно будет писать формулу.
Формала под $GUI_DOCKWIDTH вообще не требуется, это установка ширины, она не меняется.

Дано 2 элемента Label
Для них задано :
Код:
GUICtrlSetResizing(-1, $GUI_DOCKWidth)


Этим однозначно задано их поведение при изменении ширины окна.
Судя повсему словами их поведение можно описать , как пропорциональное смещение к центру.(Без изменеия ширины)

Требуется ф-ла, описывающая это поведение.

Кстати вот пример, где это выполняется, но с использованием условия : If
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>

Global $aArray[3][2]

$h_Form = GUICreate("", 800, 200, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)

$_Lab1=GUICtrlCreateLabel( '', 10, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$_Lab2=GUICtrlCreateLabel( '', 490, 10, 300, 100,0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$h_Edit1=_GUICtrlEdit_Create($h_Form, '', 10, 120, 300, 20, $ES_AUTOHSCROLL+$ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)
$h_Edit2=_GUICtrlEdit_Create($h_Form, '', 490, 120, 300, 20, $ES_AUTOHSCROLL+$ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)


$aArray[1][0]=$h_Edit1
$aArray[1][1]=10
$aArray[2][0]=$h_Edit2
$aArray[2][1]=490

GUISetState()
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	 Local $w, $h
	 $w = BitAND($lParam, 0xFFFF)
	 $h = BitShift($lParam, 16)
	 
	 $aPos=ControlGetPos($h_Form, '', $_Lab1)
	 $sText="$w= " & $w & @CRLF & "$xLab1= " & $aPos[0]
	 GUICtrlSetData($_Lab1, $sText)
	 
	 $aPos=ControlGetPos($h_Form, '', $_Lab2)
	 $sText="$w= " & $w & @CRLF & "$xLab2= " & $aPos[0]
	 GUICtrlSetData($_Lab2, $sText)
	 
	 For $i = 1 To 2
		 If $aArray[$i][1]<400  Then 
			 $x=$aArray[$i][1]* $w/800; ?????????   Нужна универсальная ф-ла
		 Else	
			 $OffSet=(800-($aArray[$i][1]+300))* $w/800
			 $x = $w-(300+ $OffSet); ?????????   Нужна универсальная ф-ла
		 EndIf
		 _WinAPI_MoveWindow($aArray[$i][0],  Floor($x), 120, 300, 20)	
		 _GUICtrlEdit_SetText($aArray[$i][0], Floor($x))
	 Next
	 
	 Return $GUI_RUNDEFMSG
EndFunc

Хотелось бы избавиться от условия If.

А по поводу использования _WinAPI_MoveWindow вместо ControlMove , так ведь обе они одинаково смещают. Возможно ControlMove работает медленнее. Зато есть возможность использовать дефолтные значения.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz [?]
Судя повсему словами их поведение можно описать , как пропорциональное смещение к центру.(Без изменеия ширины)

Вот первый вариант. Сначала я хотел использовать центры как точку отсчёта, но сразу был выход элементов за границы окна. Поэтому решил манипулировать правым и левым отступом, то есть их значения стали точкой для пропорции. Чтобы ширина не влияла, вычел её из общей ширины окна. Теоретически пропорции стали работать в соответствии с задуманным, но всё же не сходится немного с нативным результатом.
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>

Global $aEdit[3][2]
Global $aLabel[3][2]

$h_Form = GUICreate("", 800, 200, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)

$aLabel[1][0] = GUICtrlCreateLabel('', 10, 10, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$aLabel[2][0] = GUICtrlCreateLabel('', 490, 10, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

$aEdit[1][0] = _GUICtrlEdit_Create($h_Form, '', 10, 120, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)
$aEdit[2][0] = _GUICtrlEdit_Create($h_Form, '', 490, 120, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)

$aEdit[1][1] = 10
$aEdit[2][1] = 490

GUISetState()
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	Local $w, $h
	$w = BitAND($lParam, 0xFFFF)
	$h = BitShift($lParam, 16)

	$aPos = ControlGetPos($h_Form, '', $aLabel[1][0])
	$aLabel[1][1] = $aPos[0]
	$aPos = ControlGetPos($h_Form, '', $aLabel[2][0])
	$aLabel[2][1] = $aPos[0]

	For $i = 1 To 2
		$x = ($w - 300) / (800 - 300) * $aEdit[$i][1]
		_WinAPI_MoveWindow($aEdit[$i][0], Floor($x), 120, 300, 20)
		GUICtrlSetData($aLabel[$i][0], 'Label' & $i & '= ' & $aLabel[$i][1] & @CRLF & 'input' & $i & ' = ' & Floor($x))
	Next
	WinSetTitle($h_Form, '', "$w= " & $w)
	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Теоретически пропорции стали работать в соответствии с задуманным, но всё же не сходится немного с нативным результатом.

Характер процесса только похож . Это конечно не решение, т.к. зависимость от ширины элемента существует и ее надо учитывать.

Может здесь имеет место два процесса :
Первый : перемещает координаты Х на величину изменения ширины окна вправо. Он не зависит от ширины элемента.
Второй: перемещает координаты Х от центра к краям на величину зависящую от ширины элемента и изменения ширины окна .

Т.е.
Для левого элемента эти смещения противоположно направлены и результатом их должна остаться чистая пропорциональность.
Для правого элемента они складываются.

Только как выполнить это? Я уже вошел в ступор.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz [?]
Характер процесса только похож . Это конечно не решение, т.к. зависимость от ширины элемента существует и ее надо учитывать.
Зависимости от ширины элемента не существует. Берутся чисто отступы левый и правый и только их ширина пропорционально изменяется.
Вариант нативный: проверил поведение, смысл такой: проверяется ширина левого и правого отступа, какой из них меньше с тем и работаем. Если левый, то чистая пропорция по левому краю, если правый, то чистая пропорция по правому краю. Опять же повторю, мой вариант является чистой пропорцией, а нативный вариант, при изменении окна в 2 раза уменьшает меньший отступ в 2 раза, а правый пускает по бороде; если левый отступ меньше, то левый изменяет по общей пропрорции, а правый пускает по бороде. Если бы он учитывал пропорции то оба отступа соответствовали пропорции, а раз пропорции соответствует только меньший отступ, то больший не как не может этому соответствовать чисто математически.
Код:
; на самом деле усвловие не верно... за основу берётся меньший отступ, потому что элемент может оказаться справа но начало слевой стороны
		If $aArray[$i][1] < 400 Then
			; левый отступ = левый отступ * пропорция
			$x = $aArray[$i][1] * $w / 800
		Else
			; отступ справва = (ширина правого отступа) * пропорция
			$RightMargin = (800 - 300 - $aArray[$i][1]) * $w / 800
			; левый отступ = ширина окна - ширина элемента - правый отступ
			$x = $w - 300 - $RightMargin
		EndIf





Добавлено:
Сообщение автоматически объединено:

gregaz [?]
Это конечно не решение, т.к. зависимость от ширины элемента существует и ее надо учитывать
Число 300 в формуле - это ширина элемента. Повторяется там 2 раза.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Зависимости от ширины элемента не существует. Берутся чисто отступы левый и правый и только их ширина пропорционально изменяется.

Извини, но правый отступ ведь не получишь не зная ширины , значит все же зависит (от начальной позиции и ширины).
Левый отступ не зависит от ширины (только от начальной позиции)


на самом деле усвловие не верно... за основу берётся меньший отступ, потому что элемент может оказаться справа но начало слевой стороны
И с этим не согласен .
Условием выбора формулы является только левый отступ (начальная позиция).
Если левый отступ <= половины клиентской области окна , то перемещение выполняется пропорционально этому (левому) отступу.
И ширина элемента ,
а также то , что что элемент может оказаться справа но начало слевой стороны значения не имеет.
Если левый отступ > половины клиентской области окна , то перемещение уже выполняется пропорционально правому отступу.

Это видно на нижеследующем примере :
1=я пара элементов :
Здесь начала элементов расположены точно на середине окна ($x=400)
Работает чистая пропорция по начальному отступу. Не зависит от ширины элемента. (Так же будет и для $x<400)
2- пара :
Начала элементов чуть сдвинуты вправо от середины окна ($x=402) .
Уже работает пропорция по правому отступу. Зависит от ($X+ширина элемента).
3-я пара :
Левый отступ > правого
Работает чистая пропорция по начальному отступу. Не зависит от ширины элемента
4-пара :
Левый отступ < правого
Работает чистая пропорция по начальному отступу. Не зависит от ширины элемента

Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>

Global $aEdit[5][3]
Global $aLabel[5][3]

$h_Form = GUICreate("$w= " & 800, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)

$aLabel[1][0] = GUICtrlCreateLabel('', 400, 10, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)
$aEdit[1][0] = _GUICtrlEdit_Create($h_Form, '', 400, 110, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)

$aLabel[2][0] = GUICtrlCreateLabel('', 402, 150, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)
$aEdit[2][0] = _GUICtrlEdit_Create($h_Form, '', 402, 250, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)

$aLabel[3][0] = GUICtrlCreateLabel('', 300, 280, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)
$aEdit[3][0] = _GUICtrlEdit_Create($h_Form, '', 300, 380, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)

$aLabel[4][0] = GUICtrlCreateLabel('', 200, 420, 300, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)
$aEdit[4][0] = _GUICtrlEdit_Create($h_Form, '', 200, 520, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)

$aEdit[1][1] = 400
$aEdit[2][1] = 402
$aEdit[3][1] = 300
$aEdit[4][1] = 200


$aEdit[1][2] = 110
$aEdit[2][2] = 250
$aEdit[3][2] = 380
$aEdit[4][2] = 520

 For $i = 1 To 4
	$aPos = ControlGetPos($h_Form, '', $aLabel[$i][0])
	$aLabel[$i][1] = $aPos[0]
	GUICtrlSetData($aLabel[$i][0], 'Label' & $i & '= ' & $aLabel[$i][1])
Next

GUISetState()
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
    Local $w, $h
    $w = BitAND($lParam, 0xFFFF)
    $h = BitShift($lParam, 16)

    For $i = 1 To 4
		$LeftMargin = $aEdit[$i][1]
		$RightMargin = (800 - 300 - $aEdit[$i][1])
		;If $LeftMargin <= $RightMargin Then 
		If $LeftMargin <= 400 Then 
			$x=$LeftMargin * $w / 800
			_GUICtrlEdit_SetText($aEdit[$i][0], "LeftMargin")
		Else
			$x=$w - 300 - $RightMargin* $w / 800
			_GUICtrlEdit_SetText($aEdit[$i][0], "RightMargin")
		EndIf
        _WinAPI_MoveWindow($aEdit[$i][0], ($x), $aEdit[$i][2], 300, 20)
			$aPos = ControlGetPos($h_Form, '', $aLabel[$i][0])
			$aLabel[$i][1] = $aPos[0]
			GUICtrlSetData($aLabel[$i][0], 'Label' & $i & '= ' & $aLabel[$i][1] & @CRLF & 'input' & $i & ' = ' & Floor($x))
    Next
   
	 WinSetTitle($h_Form, '', "$w= " & $w)
    Return $GUI_RUNDEFMSG
EndFunc


Напрашивается вывод :
1.Универсальной ф-ии (без элемента If ) перемещения , точно совпадающего с перемещением нативного элемента не существует,т.к. сама функция перемещения нативного элемента не является непрерывной.
На этом примере, где левый отступ находится всего на 1 правее центра
при изменении окна можно наблюдать скачки нативного элемента, характерные близости к точке излома.
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

$h_Form = GUICreate("$w= " & 400, 400, 300, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xECE9D8)

GUICtrlCreateLabel('201', 201, 10, 100, 100, 0x1000)
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

2. Само использование
Код:
GUICtrlSetResizing(-1, $GUI_DOCKWidth)

с только одним параметром $GUI_DOCKWidth не предусмотрено
Нужен еще фиксирующий параметр (...LEFT,...RIGHT или ...CENTER).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz,
А пусть AutoIt сам все считает :smile:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>

Global $aArray[2][3]

$h_Form = GUICreate('', 800, 200, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
GUISetBkColor(0xECE9D8)
For $i = 0 To 1
	GUICtrlCreateLabel('', 10 + 390 * $i, 10, 300, 100, $SS_SUNKEN)
	GUICtrlSetResizing(-1, $GUI_DOCKWidth)
	$aArray[$i][0] = GUICtrlCreateLabel('', 10 + 390 * $i, 120, 300, 20)
	$aArray[$i][1] = GUICtrlGetHandle($aArray[$i][0])
	GUICtrlSetState($aArray[$i][0], $GUI_HIDE)
	GUICtrlSetResizing($aArray[$i][0], $GUI_DOCKWidth)
	$aArray[$i][2] = _GUICtrlEdit_Create($h_Form, '', 10 + 390 * $i, 120, 300, 20, $ES_AUTOHSCROLL + $ES_AUTOVSCROLL, $WS_EX_CLIENTEDGE)
Next

GUISetState()
GUIRegisterMsg($WM_SIZE, '_WM_SIZE')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	Local $aPos

	For $i = 0 To 1
		$aPos = ControlGetPos($h_Form, '', $aArray[$i][1])
		_WinAPI_MoveWindow($aArray[$i][2], $aPos[0], $aPos[1], $aPos[2], $aPos[3])
	Next
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_SIZE
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
А пусть AutoIt сам все считает

Это было бы слишком просто.
Пришлось бы для каждого элемента, созданного с помощью UDF создавать его нативный аналог.
И если элементов несколько, то то будут расхождения из-за запаздывания (при получении ControlGetPos).

Когда-то я пытался использовать это, но именно из-за расхождения отказался.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz [?]
Цитата
Зависимости от ширины элемента не существует. Берутся чисто отступы левый и правый и только их ширина пропорционально изменяется.
Извини, но правый отступ ведь не получишь не зная ширины , значит все же зависит (от начальной позиции и ширины). Левый отступ не зависит от ширины (только от начальной позиции)
То что правый отступ зависит от ширины это как бы неотъемлимая часть любой формулы не использующей правый отступ как константу. Здесь и так очевидно без доказательств. Я имел ввиду сохранение пропорций отступа не зависит от ширины. К примеру правый отступ в 2 раза больше левого. Как бы ты не изменял размер окна, правый отступ будет всегда в 2 раза больше левого. Если в 3, так в 3. То есть пропорция сохраняется всегда независимо какая бы ширина элемента не была. Конечно если окно меньше элемента то это уже другая история.
На счёт нативного варианта было скорее предположительное утверждение, не исключая сложных выворотов, которые нужно было выводить и создавая различные в том числе и экстремальные ситуации и двигая во всех вариантах. Угадывать все свойства даже не хотелось, намного проще задавать свои свойства, то есть определить каким окно должно быть в этих и в этих случаях. Так сделать проще чем выводить зависимости. Если только интерфейс предполагает смешанный вариант и нужно синхронизировать поведение, то тут конечно вскрывать/повторить WinAPI функции или для каждого элемента создать скрытый дубликат того же размера и позиции, чтобы с него их брать.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles
А еще,как я помню было неправильная работа при максимизации.
ControlGetPos в _WM_SIZE при максимзации выдавал позиции до максимизации.


Добавлено:
Сообщение автоматически объединено:

AZJIO
Так какой вывод можно сделать ? Формула (без If) существует или ?.
Просто жаль потраченного времени.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz [?]
_WM_SIZE выдавал позиции до максимизации
WM_SIZING - выполняет при отпуске мыши. То есть не будет ситуации что быстро отпустил мышь во время движения изменения размера и они нарисовались непропорционально. Событие встанет в очередь и обязательно выполнится.


Добавлено:
Сообщение автоматически объединено:

gregaz [?]
Формула (без If) существует или ?.
Чем If не устраивает? неужели сложный рассчёт выгоднее чем логическая проверка, примитивный шаг против многочисленных операций вычисления. Были мысли, к примеру если 300/400 всегда будет округлённо 0, а 500/400 - всегда будет округлённо 1 то есть если далее развивать мысль, то можно получить формулу на основе математических операций, но не вижу выгоды против логических операций? Откуда пренебрежение? Или мысль, что формула это быстрее? Или что в одну строку то это круто, а если в две, то лучше не писать программу?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
WM_SIZING - выполняет при отпуске мыши. То есть не будет ситуации что быстро отпустил мышь во время движения изменения размера и они нарисовались непропорционально. Событие встанет в очередь и обязательно выполнится.

Попробуй в примере от madmasles нажать кнопку максимизации (хоть и с WM_SIZING).




Добавлено:
Сообщение автоматически объединено:

AZJIO [?]
Чем If не устраивает?
Просто мне казалось, что есть простое решение, которого я не вижу.
Долго пытался найти самостоятельно.Потратил много времени.
В конце-концов обратился с вопросом , надеясь на простое решение.
Видно не судьба. Можно оставить как было с If.
Спасибо всем за участие.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Событие не выполняется при максимизации. Просто нужно посмотреть это событие и назначить на него эту функцию.

WM_SIZE выполняется при максимизации
Код:
If $wParam = 2 Then MsgBox(0, 'Сообщение', 'Событие')

но при этом рассчёт делает до того как изменился размер элементов.
 
Верх