Что нового

GUICtrlSetOnResize - Библиотека для изменения размера элементов GUI

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.3.6.1
Версия: 1.2

Категория: Мышь и клавиатура, Элементы GUI

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

Синтаксис использования:
Код:
_GUICtrl_SetOnResize($hWnd [, $nCtrlID = -1 [, $iWait = 10 [, $iCtrlMinSize = $iGCSOR_DefCtrlMinSize [, $iResizeEdgeFlags = -1]]]])


$hWnd -> Дескриптор окна (возвращаемый функцией GUICreate()).
$nCtrlID -> [Optional] ID элемента (поддерживается -1 для указания последнего созданного элемента).
$iWait -> [Optional] Время задержки между попытками изменения размера (в миллисекундах).
$iCtrlMinSize -> [Optional] Минимальный изменяемый размер.
$iResizeEdgeFlags -> [Optional] Флаги для режима изменения размера, см. константы флагов (по умолчанию -1, изменять во всех режимах).

Доступные флаги:
$iGCSOR_RESIZE_LEFT - Изменение размера с левой стороны элемента
$iGCSOR_RESIZE_RIGHT - Изменение размера с правой стороны элемента
$iGCSOR_RESIZE_TOP - Изменение размера с верхней границы элемента
$iGCSOR_RESIZE_BOTTOM - Изменение размера с нижней границы элемента
$iGCSOR_RESIZE_LEFTTOPCORNER - Изменение размера с верхнего-левого угла элемента
$iGCSOR_RESIZE_LEFTBOTTOMCORNER - Изменение размера с нижнего-левого угла элемента
$iGCSOR_RESIZE_RIGHTTOPCORNER - Изменение размера верхнего-правого угла элемента
$iGCSOR_RESIZE_RIGHTBOTTOMCORNER - Изменение размера с нижнего-правого угла элемента
$iGCSOR_RESIZE_ALLCORNERS - Изменение размера со всех углов элемента
$iGCSOR_RESIZE_ALL - Изменение размера со всех сторон элемента

Для отключения режима изменения размера у определённого элемента, просто вызовите функцию таким образом:
Код:
_GUICtrl_SetOnResize(-1, $iCtrlID)


Пример:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "GUICtrlSetResizing.au3"

$hGUI = GUICreate("_GUICtrl_SetOnResize - Example", 700, 480) ;, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

$Edit = GUICtrlCreateEdit("Resize only Left edge", 40, 40, 280, 200)
_GUICtrl_SetOnResize($hGUI, $Edit, 10, $iGCSOR_DefCtrlMinSize, $iGCSOR_RESIZE_LEFT) ;Resize only Left edge (-1 or $iGCSOR_RESIZE_ALL to resize all)

$ListView = GUICtrlCreateListView("ListView Column", 340, 40, 300, 200)
GUICtrlCreateListViewItem("Item (Top + Bottom)", $ListView)
_GUICtrl_SetOnResize($hGUI, $ListView, 10, $iGCSOR_DefCtrlMinSize, BitOR($iGCSOR_RESIZE_TOP, $iGCSOR_RESIZE_BOTTOM)) ;Resize Top + Bottom

$Checkbox = GUICtrlCreateCheckbox("Some Checkbox (Left + Right)", 40, 270)
GUICtrlSetBkColor(-1, 0xFFFFFF)
_GUICtrl_SetOnResize($hGUI, $Checkbox, 10, $iGCSOR_DefCtrlMinSize, BitOR($iGCSOR_RESIZE_LEFT, $iGCSOR_RESIZE_RIGHT)) ;Resize Left + Right

$Label = GUICtrlCreateLabel("Some Label (Top + Right)", 40, 320, -1, 15)
GUICtrlSetBkColor(-1, 0x0000FF)
GUICtrlSetColor(-1, 0xFFFFFF)
_GUICtrl_SetOnResize($hGUI, $Label, 10, 15, BitOR($iGCSOR_RESIZE_TOP, $iGCSOR_RESIZE_RIGHT)) ;Resize Top + Right

$Button = GUICtrlCreateButton("Some Button (All corners)", 40, 370, 160, 40)
_GUICtrl_SetOnResize($hGUI, $Button, 10, $iGCSOR_DefCtrlMinSize, $iGCSOR_RESIZE_ALLCORNERS) ;Resize All Corners

GUISetState(@SW_SHOW, $hGUI)

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

Файл: GUICtrlSetResizing.zip

Скнимок:

История версий:
1.2
* Имена констант флагов изменены с $iGCSOR_*_EDGE на $iGCSOR_RESIZE_*.
+ Добавлены флаги для установки режимов изменения размера с углов элемента:
$iGCSOR_RESIZE_LEFTTOPCORNER, $iGCSOR_RESIZE_LEFTBOTTOMCORNER
$iGCSOR_RESIZE_RIGHTTOPCORNER, $iGCSOR_RESIZE_RIGHTBOTTOMCORNER
- Для установки режима изменения размера со всех углов элемента, используйте $iGCSOR_RESIZE_ALLCORNERS.
+ Добавлен флаг $iGCSOR_RESIZE_ALL (вместо -1).
* Исправлена проблема с восстановлением оригинальных размеров элементов после изменения размера главного (родительского) окна (при использований стиля $WS_SIZEBOX).
* Теперь изменение размера элементов ограничено размером родительского окна (элементы больше не могут растягиваться за пределы главного окна).
* Обновлён пример.
* Обновлена/добавлена документация.

1.1
* Совместимость с 3.3.6.1
+ Добавлена возможность указать режим изменения размера.
* Глобальное улучшение работы библиотеки.

1.0
* Первая версия.

Источник: www.autoit.script.ru
Автор(ы): G.Sandler (CreatoR)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А можно растягивать за какой-нибудь угол?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
А можно растягивать за какой-нибудь угол?
Если задать флаги BitOR($iGCSOR_BOTTOM_EDGE, $iGCSOR_RIGHT_EDGE), то можно. Но если имеется в виду только за угол, тогда нет, пока нельзя, если очень надо могу позже попробовать сделать флаг для этого.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Если основное окно имеет стиль $WS_SIZEBOX и, если, после изменения размеров контролов изменить размер окна, все размеры контролов сбрасываются на дефолтные.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
Если основное окно имеет стиль $WS_SIZEBOX и, если, после изменения размеров контролов изменить размер окна, все размеры контролов сбрасываются на дефолтные.
Забавно. Это из за ControlMove:

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

$hGUI = GUICreate("Test Script", 300, 200, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
$nButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)
GUISetState(@SW_SHOW, $hGUI)

ControlMove($hGUI, "", $nButton, 20, 40, 100, 25)

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


Решение: заменить в библиотеке ControlMove на GUICtrlSetPos.
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Мне не хватило автоподгонки остальных элементов под оставшееся место. На пример сейчас можно растянуть какой-нибудь GUICtrl поверх других, а можно было бы проверять если растягиваемый элемент перекрывает какой-нибудь другой, то ресайзить и перекрываемый GUICtrl (делать это в момент растягивания первого). А также наоборот, если свободного места больше чем занимает "второй" элемент, то ресайзить и его на все оставшееся место. В общем прилепить края окружающих GUICtrl к краям растягиваемого GUICtrl.

И, уж раз пошла такая пьянка, можно добавить новый параметр $iCtrlOffset, который задавал бы расстояние между границами элементов. О как загнул!! :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Pelerin [?]
сейчас можно растянуть какой-нибудь GUICtrl поверх других, а можно было бы проверять если растягиваемый элемент перекрывает какой-нибудь другой, то ресайзить и перекрываемый GUICtrl (делать это в момент растягивания первого).
Нет, это уже слишком, могу сделать ограничение, чтобы растягиваемый элемент не растягивался поверх остальных элементов. Кстати, уже сделал такое ограничение для границ окна.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А растягивание за углы...

:whistle:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление:

[1.2]
* Имена констант флагов изменены с $iGCSOR_*_EDGE на $iGCSOR_RESIZE_*.
+ Добавлены флаги для установки режимов изменения размера с углов элемента:
$iGCSOR_RESIZE_LEFTTOPCORNER, $iGCSOR_RESIZE_LEFTBOTTOMCORNER
$iGCSOR_RESIZE_RIGHTTOPCORNER, $iGCSOR_RESIZE_RIGHTBOTTOMCORNER
- Для установки режима изменения размера со всех углов элемента, используйте $iGCSOR_RESIZE_ALLCORNERS.
+ Добавлен флаг $iGCSOR_RESIZE_ALL (вместо -1).
* Исправлена проблема с восстановлением оригинальных размеров элементов после изменения размера главного (родительского) окна (при использований стиля $WS_SIZEBOX).
* Теперь изменение размера элементов ограничено размером родительского окна (элементы больше не могут растягиваться за пределы главного окна).
* Обновлён пример.
* Обновлена/добавлена документация.
 

neobi

Новичок
Сообщения
25
Репутация
1
Ещёбы очень хотелосьбы чтобы не за всю стенку элемента тянуть можно было, а только за квадратик по середине и по углам Былобы вообще КРУТЕЦКИ :whistle:

Вот как на картинке
 
Верх