Что нового

[Элементы GUI] Как использовать ф-ию : GUICtrlSetPos с Opt ( 'GUICoordMode', 2)

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Требуется сдвинуть несколько элементов на одну и туже величину по высоте
В примере с Opt ( 'GUICoordMode', 2) элементы создаются, но перемещаются некорректно.
Видимо что-то недопонимаю :(
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

AutoItSetOption ( 'GUICoordMode', 2)
Dim $aLab[6]

$h_GUI = GUICreate('', 300, 700 )
GUISetBkColor(0xDCDAC1, $h_GUI)
$_But = GUICtrlCreateButton('Down', 5, 10, 60, 20)
GUISetCoord(20, 10)
For $i=1 To 5
	$aLab[$i] = GUICtrlCreateLabel($i, -1, 0, 200, 20+10*$i, 0x1000)
Next

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $_But
			For $i=3 To 5 
				GUICtrlSetPos($aLab[$i], -1, 350)
			Next
	EndSwitch
WEnd
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Re: [Элементы GUI] Как использовать ф-ию : GUICtrlSetPos с Opt ( \'GUICoordMode\', 2)

gregaz
У вас установка элементов происходит по одному и тому же числу, вы создавали же их по формуле, следовательно и передвигать то же по формуле требуется


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

Может так:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
AutoItSetOption ( 'GUICoordMode', 2)
Dim $aLab[6]
$h_GUI = GUICreate('', 300, @DesktopHeight-10)
GUISetBkColor(0xDCDAC1, $h_GUI)
$_But = GUICtrlCreateButton('Down', 5, 10, 60, 20)
GUISetCoord(20, 10)
For $i=1 To 5
    $aLab[$i] = GUICtrlCreateLabel($i, -1, 0, 200, 20+10*$i, 0x1000)
Next
GUISetState()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $_But
            For $i=3 To 5
                GUICtrlSetPos($aLab[$i], -1, 250+(65*$i))
            Next
    EndSwitch
WEnd
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: [Элементы GUI] Как использовать ф-ию : GUICtrlSetPos с Opt ( \'GUICoordMode\', 2)

MnM [?]

Дак с использованием дополнительных средств выполнить это можно.
Однако высоты элементов могут быть разными, не описуемыми одной формулой.

Просто в справке ведь сказано про Opt ( 'GUICoordMode', 2) ,что она предназначена именно для ф-ии GUICtrlSetPos

А получающийся у меня результат я мог получить и без этой опции
Код:
GUICtrlSetPos($aLab[$i], Default, 350)





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

Получается для каждого элемента я при перемещении должен опредлять высоту и расстояние между элементами.
В чем смысл тогда этой опции? При создании элементов она сама учитывает высоту предыдущего элемента , а при перемещении не хочет
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
gregaz [?]
Просто в справке ведь сказано про Opt ( 'GUICoordMode', 2) ,что она предназначена именно для ф-ии GUICtrlSetPos
Я ничего не понял, но GUICoordMode и GUICtrlSetPos никакой связи.
GUICtrlSetPos действует самостоятельно, а при -1 или "Default" просто делает запрос текущей координаты и подставляет в качестве параметра при вызове WinAPI. Это более предполагаемый вариант.
GUICoordMode я бы сказал пытается сделать внутренние вычисления при создании нового элемента, но эти вычисления не настолько сложны чтобы добавлять функцию, вполне себе пару строк, в которых на каждой итерации задаётся сдвиг методом умножения шага на размер элемента. Разгадать работу функции, чтобы её в совершенстве применять сложнее чем сделать свой цикл с вычислениями. Я понял работу именно после создания собственных функций.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: [Элементы GUI] Как использовать ф-ию : GUICtrlSetPos с Opt ( \\\'GUICoordMode\\\', 2)

AZJIO
Меня сбивает с толку описание справки про Opt ( 'GUICoordMode') :
В ней говорится :
Изменяет способ установки позиции элемента определяемый функциями GUICtrlSetPos и GUICtrlCreate....
0 = относительно позиции начала последнего элемента (верхний левый угол).
1 = (по умолчанию) абсолютные координаты, но всё же относительно клиентской области окна.
2 = ячейка позиционируется относительно текущей ячейки

Поведение GUICtrlCreate действительно меняется, т.к. при 2-ке само учитывает размер предыдущего элемента.Очень удобно.

А что меняется в исполнении ф-ии GUICtrlSetPos при изменении Opt с 0 на 2 ? Ничего.

Так зачем нужна эта опция ? В английской справке вообще говорится о ее назначении именно только для ф-ии GUICtrlSetPos


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

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


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

Еще вариант создавать массив габаритов сразу при создании элементов, постоянно корректировать его при изменении габарита и использовать его при перемещении группы.
А по поводу опции видимо она нужна была для ранних версий АutoIt, когда нельзя было использовать параметр Default. Сейчас это ни к чему(для ф-ии GUICtrlSetPos) и справка некорректна.(особенно англ.)
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
gregaz
Я отписал на офсайте.

На счёт массива. Зачем хранить, ведь данные изменяются при сдвиге и старая информация не нужна, можно вполне использовать новую информацию сразу а не из массива. Сделать чтобы изменяемые объекты были по порядку, а потом изменив один объект в средине, запросить его координаты и размер и использовать приращение для всех следующих элементов чей идентификатор больше изменённого.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
и использовать приращение для всех следующих элементов
Но тогда все равно надо опрашивать все элементы на предмет его текущей позиции , ведь ,
а формат
Код:
GUICtrlSetPos(Default, Default+$Delta )
она не воспримет.
Поясни.
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
gregaz
Ну да, высоту придётся запрашивать. Ну тогда сделать массив компактный, например только Y-координату элементов. И прибавлять разницу высоты. Или сохранять высоту, а Y-координату получать приращением очередной высоты.
 
Верх