Что нового

[Элементы GUI] Как изменить опцию "GUIResizeMode", внутри скрипта ?

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Требуется возможность измения поведения всех контролов при изменении размеров окна.
Изменением опции "GUIResizeMode" мне не удается :
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt("GUIResizeMode", 1)

;Opt("GUIResizeMode", $GUI_DOCKALL); Можно запретить ресайз

$hForm = GUICreate('Test', 300, 350, -1, -1, $WS_SIZEBOX+$WS_SYSMENU)
GUISetBkColor(0xECE9D8)

$hInput1=GUICtrlCreateInput ( "", 5, 10, 250, 20)
$hInput2=GUICtrlCreateInput ( "", 5, 40, 250, 20)

$ButTest1=GUICtrlCreateButton('Test1', 150, 270, 40, 25)
$ButTest2=GUICtrlCreateButton('Test2', 200, 270, 40, 25)
$ButTest3=GUICtrlCreateButton('Test3', 250, 270, 40, 25)

Opt("GUIResizeMode", $GUI_DOCKALL); Запретить ресайз не удается

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		 Case $ButTest1
			$Opt=AutoItSetOption ("GUIResizeMode", 0); Реакция отсутствует
			ConsoleWrite ("$Opt = " & $Opt & @LF)
		Case $ButTest2
			$Opt=AutoItSetOption ("GUIResizeMode", $GUI_DOCKALL) ; Запретить ресайз не удается
			ConsoleWrite ("$Opt = " & $Opt & @LF)
		 Case $ButTest3
			$Opt=AutoItSetOption ("GUIResizeMode", $GUI_DOCKSIZE); Реакция отсутствует
			ConsoleWrite ("$Opt = " & $Opt & @LF) 
	EndSwitch
WEnd


Поведение элементов не меняется, хотя значение опции меняется
Что-то я не так делаю.
Неужели надо для всех элементов изменять
с помощью : GUICtrlSetResizing (-1, ;$Opt ) ?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вот такой костыль можно попробовать, но расположение элементов на форме сбросится:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global $hForm, $hInput1, $hInput2, $ButTest1, $ButTest2, $ButTest3
_draw(1)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButTest1
			GUIDelete()
			_draw(0)
		Case $ButTest2
			GUIDelete()
			_draw($GUI_DOCKALL)
		Case $ButTest3
			GUIDelete()
			_draw($GUI_DOCKSIZE)
	EndSwitch
WEnd

Func _draw($flag)
	Local $Opt = AutoItSetOption('GUIResizeMode', $flag)
	ConsoleWrite('$Opt = ' & $Opt & @LF)
	$hForm = GUICreate('Test', 300, 350, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
	GUISetBkColor(0xECE9D8)

	$hInput1 = GUICtrlCreateInput('', 5, 10, 250, 20)
	$hInput2 = GUICtrlCreateInput('', 5, 40, 250, 20)

	$ButTest1 = GUICtrlCreateButton('Test1', 150, 270, 40, 25)
	$ButTest2 = GUICtrlCreateButton('Test2', 200, 270, 40, 25)
	$ButTest3 = GUICtrlCreateButton('Test3', 250, 270, 40, 25)

	GUISetState()

EndFunc
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: [Элементы GUI] Как изменить опцию \"GUIResizeMode\", внутри скрипта ?

Redline [?]
Вот такой костыль можно попробовать, но расположение элементов на форме сбросится:

Но это опять же перечисление всех элементов.А если их много?

С перечислением проще в массиве задать всем GUICtrlSetResizing (-1, ;$Opt )

Надеюсь , должен быть способ попроще.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
gregaz [?]
С перечислением проще в массиве задать всем GUICtrlSetResizing

Да, с перечислением код даже симпатичнее. По мне так вполне нормальный способ :smile:
Плюс все элементы (и их значения) на своих местах:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIResizeMode', 1)

$hForm = GUICreate('Test', 300, 350, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
GUISetBkColor(0xECE9D8)

Dim $aControls[5] = [GUICtrlCreateInput('text1', 5, 10, 250, 20), _
GUICtrlCreateInput('text2', 5, 40, 250, 20), _
GUICtrlCreateButton('Test1', 150, 270, 40, 25), _
GUICtrlCreateButton('Test2', 200, 270, 40, 25), _
GUICtrlCreateButton('Test3', 250, 270, 40, 25)]

GUISetState()

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aControls[2]
			For $i = 0 To UBound($aControls) - 1
				GUICtrlSetResizing($aControls[$i], $GUI_DOCKAUTO)
			Next
		Case $aControls[3]
			For $i = 0 To UBound($aControls) - 1
				GUICtrlSetResizing($aControls[$i], $GUI_DOCKALL)
			Next
		Case $aControls[4]
			For $i = 0 To UBound($aControls) - 1
				GUICtrlSetResizing($aControls[$i], $GUI_DOCKSIZE)
			Next
	EndSwitch
WEnd
А по поводу Opt('GUIResizeMode', flag), в справке указано: GUIResizeMode Change default resizing for a control. Т.е. это значение по-умолчанию для еще неотрисованных элементов, для которых не указано GUICtrlSetResizing
Вот доказательство (размеры GUICtrlCreateInput меняются (авто), а положение кнопок закреплено (DOCKALL)):
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIResizeMode', 1)


$hForm = GUICreate('Test', 300, 350, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
GUISetBkColor(0xECE9D8)

$hInput1 = GUICtrlCreateInput('', 5, 10, 250, 20)
$hInput2 = GUICtrlCreateInput('', 5, 40, 250, 20)

Opt('GUIResizeMode', $GUI_DOCKALL)

$ButTest1 = GUICtrlCreateButton('Test1', 150, 270, 40, 25)
$ButTest2 = GUICtrlCreateButton('Test2', 200, 270, 40, 25)
$ButTest3 = GUICtrlCreateButton('Test3', 250, 270, 40, 25)

GUISetState()

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

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Можно попробовать сделать "окно в окне".
Во внутреннем окне сделать все элементы.
Когда пользователь изменяет размер внешнего окна, либо изменять размер внутреннего, либо не изменять.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Redline [?]
А по поводу Opt('GUIResizeMode', flag), в справке указано: GUIResizeMode Change default resizing for a control. Т.е. это значение по-умолчанию для еще неотрисованных элементов, для которых не указано GUICtrlSetResizing

Да , действительно , видимо задать так можно только для последующих элементов.

dwerf [?]
Можно попробовать сделать "окно в окне".

Тоже интересное решение, но не уверен, что доп. окно в дальнейшем не прбавит заморочек.

Все же видимо проще обработка всех элементов, скажем так :
Код:
;..................................
$ControlDummy=GUICtrlCreateDummy()
$hInput1=GUICtrlCreateInput ( "", 5, 10, 250, 20)
$hInput2=GUICtrlCreateInput ( "", 5, 40, 250, 20)

$ButTest1=GUICtrlCreateButton('Test1', 150, 270, 40, 25)
$ButTest2=GUICtrlCreateButton('Test2', 200, 270, 40, 25)
$ButTest3=GUICtrlCreateButton('Test3', 250, 270, 40, 25)

;......................................

Case $ButTest3
   For $i=$ControlDummy To $ButTest3
   GUICtrlSetResizing($i, $GUI_DOCKALL)
Next


Чтобы обойтись без массива (при большом кол-ве элементов массив не очень удобен)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
gregaz [?]

Если использовать GUIDelete или GUICtrlDelete, а потом создать новые элементы, нумерация этих элементов начнётся с освободившихся чисел.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
dwerf [?]
Если использовать GUIDelete или GUICtrlDelete, а потом создать новые элементы, нумерация этих элементов начнётся с освободившихся чисел.

Да верно.

Это применимо,если заранее знаещь, что удалений в скрипте не предвидится

Иначе усложнять код использованием массива.
Тогда уж проще с доп. окном ,наверное ?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
gregaz [?]
Тогда уж проще с доп. окном ,наверное ?
Наверное, если ещё какой-нибудь способ не придумать.
А элементы можно не удалять, а просто скрывать.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: [Элементы GUI] Как изменить опцию \"GUIResizeMode\", внутри скрипта ?

И все же разговор ведь идет об установкие опции общей для всех элементов скрипта,
поэтому возможность изменения нумерация этих элементов не актуальна.
Меняем опцию для всех элементов между GUICtrlCreateDummy() и последним.


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

dwerf [?]
Наверное, если ещё какой-нибудь способ не придумать.

Видимо так.
Мне главное надо было убедиться, что я не пропускаю простое решение.
Спасибо.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Из теста я понял что GUIResizeMode применяет к элементам GUICtrlSetResizing, то есть смена параметра GUIResizeMode будет влиять только на последующие элементы. Пересоздавать думаю нет смысла, проще всем элементам перечислить новый GUICtrlSetResizing, так экономичнее. На счёт простоты - это и есть простое решение, чем же оно сложнее GUIResizeMode, которая делает тоже самое. Скорость выполнения тоже мгновенна, так что это не сложное и не ресурсоёмкое решение.

Например 100тысяч проверок условий отнимает время 0.07 сек. Поэтому не стоит заморачиваться по поводу лишней проверки, кроме сложности самого условия. Так же не стоит заморачиваться по поводу GUICtrlSetResizing даже если элементов в окне несколько тысяч.


Само окно тормозит при изменении размеров, а функция отрабатыват за 1 милисекунду

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

Opt("GUIResizeMode", 1)

$hForm = GUICreate('Test', 300, 350, -1, -1, $WS_OVERLAPPEDWINDOW)
$ControlDummy=GUICtrlCreateDummy()
For $i=1 To 1000
   GUICtrlCreateButton('ммм', 11, 11, 40, 25)
Next
$ButTest1=GUICtrlCreateButton('Test1', 150, 270, 40, 25)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
         Case $ButTest1
			$timer = TimerInit()
			For $i=$ControlDummy To $ButTest1
			   GUICtrlSetResizing($i, 802)
			Next
			MsgBox(0,"Время выполнения", Round(TimerDiff($timer), 2) & ' мсек')
    EndSwitch
WEnd
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
На счёт простоты - это и есть простое решение

Да видимо все так и есть.
Самое оптимальное решение :
Устанавливать для всех элементов нужный GUICtrlSetResizing .

Спасибо всем.
 
Верх