Что нового

[Элементы GUI] Изменить размеры окна вместе с элементами без увеличения на весь экран

erlik

Продвинутый
Сообщения
317
Репутация
84
Не могу понять, как сделать, чтобы бы при клике на системную кнопку "развернуть окно" - программа разворачивалась не на весь экран - а скажем просто увеличивала свои размеры например раза в полтора - сохраняя пропорции элементов. В опциях ничего про задание размеров нет :scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
erlik [?]
как сделать, чтобы бы при клике на системную кнопку "развернуть окно" - программа разворачивалась не на весь экран - а скажем просто увеличивала свои размеры
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIEventOptions", 1)

$iGUI_Width = 300
$iGUI_Height = 200

$hGUI = GUICreate("Test Script", $iGUI_Width, $iGUI_Height, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

$nButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_MINIMIZE
			GUISetState(@SW_MINIMIZE, $hGUI)
		Case $GUI_EVENT_RESTORE
			GUISetState(@SW_RESTORE, $hGUI)
		Case $GUI_EVENT_MAXIMIZE
			$aWinClientSize = WinGetClientSize($hGUI)
			
			If $aWinClientSize[0] <= $iGUI_Width Then
				WinMove($hGUI, "", Default, Default, $iGUI_Width + ($iGUI_Width / 2), $iGUI_Height + ($iGUI_Height / 2))
			Else
				WinMove($hGUI, "", Default, Default, $iGUI_Width, $iGUI_Height)
			EndIf
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
erlik
Код:
Global $k=0
$Gui = GUICreate("Измени размер окна, максимизируй", 390, 140, -1, -1, 0x00040000+0x00020000+0x00010000)
GUICtrlCreateLabel('Функция WM_GETMINMAXINFO срабатывает во время перемещения окна, сворачивания и изменения размеров. Позволяет установить пределы увеличения и уменьшения окна как по горизонтали так и по вертикали индивидуально. А также позицию и размеры развёрнутого состояния. Установочные параметры можно игнорировать указав только необходимые параметры.', 5, 5, 360, 130)

GUISetState()

GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")

Do
Until GUIGetMsg() = -3

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
	$k+=1
	WinSetTitle($Gui, '', 'Попытка ' &$k& ' раз')
	#forceref $iMsg, $wParam
	If $hWnd = $GUI Then
		Local $tMINMAXINFO = DllStructCreate("int;int;" & _
				"int MaxSizeX; int MaxSizeY;" & _
				"int MaxPositionX;int MaxPositionY;" & _
				"int MinTrackSizeX; int MinTrackSizeY;" & _
				"int MaxTrackSizeX; int MaxTrackSizeY", _
				$lParam)
		DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 360) ; минимальные размеры окна
		DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 130)
		DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 460) ; максимальные размеры окна
		DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", 180)
		DllStructSetData($tMINMAXINFO, "MaxSizeX", 400) ; размеры развёрнутого состояния ( просто удали строку, чтоб игнорировать критерий)
		DllStructSetData($tMINMAXINFO, "MaxSizeY", 180)
		DllStructSetData($tMINMAXINFO, "MaxPositionX", 400) ; позиция в развёрнутом состоянии
		DllStructSetData($tMINMAXINFO, "MaxPositionY", 450)
	EndIf
EndFunc
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
Твой вариант у меня к сожалению только перемещал окно в левый верхний угол - без изменения размеров.

AZJIO
Именно то что нужно. :ok: Спасибо.

ЗЫ: У меня еще есть маленький вопрос - (тему новую да простят меня модераторы уж не буду создавать) - как можно регулировать ширину заголовка колонки ListView(чтобы и строки под него подстраивались)? В документации написано, что якобы пробелами, однако у меня они ни на что не влияют. Просто часть длины строки остается скрытой -
Вот так:
А хотелось бы, чтобы так:
Ну то есть, чтобы изначально сразу так делалось - без ручных манипуляций. Или ширина в 25 символов - это предел, который программно не меняется? Хотя, у меня и строки менее 25 символов также остаются частично скрытыми.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
erlik [?]
Твой вариант у меня к сожалению только перемещал окно в левый верхний угол - без изменения размеров.
Какая версия AutoIt?
Под 3.3.6.1 должно работать нормально.

Именно то что нужно
Странно, не вижу чтобы в первом сообщений писалось об ограничений и размерности размера окна.
К тому же учти, это неправильная манера написания кода. AZJIO, я тебе основательно не советую так писать код, будет трудно при больших проектах.
Пример хороший, но имхо, не совсем отвечает критериям указанным в первом сообщений.

У меня еще есть маленький вопрос - (тему новую да простят меня модераторы уж не буду создавать)
Я надеюсь что модераторы не простят, по крайней мере я не прощаю. Вопрос совершенно другой тематики.

Тема решена?
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
В том то и дело, что твой пример рабочий сам по себе (я пробовал)- но мое окно он не увеличивал - окно на долю секунды типа пытается поменять размер и тут же скачет в левый верхний угол оставаясь при своих размерах. Версия AutoIT последняя - указана в профиле.
У меня правда вместо цикла с GUIGetMsg() - каллбеки:
Код:
GUISetOnEvent($GUI_EVENT_CLOSE, "MainWndClose")
;GUISetOnEvent($GUI_EVENT_MINIMIZE, "MainWndMinimize") -последние два сейчас не использую.
;GUISetOnEvent($GUI_EVENT_MAXIMIZE, "MainWndMaximize")


А вариант AZJIO сработал категорично - и очень удобно на мой взгляд задавать нужные размеры и позицию при разворачивании окна.

не вижу чтобы в первом сообщений писалось об ограничений и размерности размера окна
Ну про возможность ограничения размерности я даже не знал - поэтому сформулировал тему в общих чертах. И...тема решена :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
erlik [?]
меня правда вместо цикла с GUIGetMsg() - каллбеки
И потвоему это минорный фактор?
Ты пример то хоть понял?
Если понял, то должен был адаптировать таким образом:

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

Opt("GUIEventOptions", 1)
Opt("GUIOnEventMode", 1)

$iGUI_Width = 300
$iGUI_Height = 200

$hGUI = GUICreate("Test Script", $iGUI_Width, $iGUI_Height, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))

GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_Events")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "_GUI_Events")
GUISetOnEvent($GUI_EVENT_RESTORE, "_GUI_Events")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_GUI_Events")

$nButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Sleep(10)
WEnd

Func _GUI_Events()
	Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_MINIMIZE
            GUISetState(@SW_MINIMIZE, $hGUI)
        Case $GUI_EVENT_RESTORE
            GUISetState(@SW_RESTORE, $hGUI)
        Case $GUI_EVENT_MAXIMIZE
            $aWinClientSize = WinGetClientSize($hGUI)
            
            If $aWinClientSize[0] <= $iGUI_Width Then
                WinMove($hGUI, "", Default, Default, $iGUI_Width + ($iGUI_Width / 2), $iGUI_Height + ($iGUI_Height / 2))
            Else
                WinMove($hGUI, "", Default, Default, $iGUI_Width, $iGUI_Height)
            EndIf
    EndSwitch
EndFunc


очень удобно на мой взгляд задавать нужные размеры и позицию при разворачивании окна
Это задаёт не нужные размеры, а ограничение размера GUI. Подобное решение обычно называют костылём, хоть и неплохим в этом случае.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
Адаптировал - но без кейс инструкций, а просто тремя функциями.
...И в последнем варианте тоже не работает - при включенной опции Opt("GUIEventOptions",1) вообще ничего не происходит. А при выключенной - все как обычно.
Сам понимаешь перелопачивать 4 тысячи строк кода - в целях найти чего там там не подходит для твоего кода я уж вряд ли буду. Но на будущее, конечно, - подобный вариант запомню.
Глядишь и разберусь позже почему он не работал...
---------------------------------------
Спустя пять минут...
Заработал! Нда, видимо AutiIT это язык в котором от перемены мест слагаемых меняется очень многое - уже второй раз наступаю на те же грабли.
Не работало, потому что каллбеки нифига не регистрировались - вставил их в основную функцию и все пошло.
 

Art379

Новичок
Сообщения
3
Репутация
0
Можно ли как-то иначе изменить размер окна, кроме использования WinMove? Но так же просто :smile:

Если WinMove'ом изменить размер окна, то все (или большинство?) элементов сместятся, наскочат друг на друга) чтоб этого избежать нужно использовать GUICtrlSetResizing(-1, $GUI_DOCKSIZE) после создания каждого нового элемента... это получается после каждой строчки GUICtrlCreate*чегототам*
нужно писать строку GUICtrlSetResizing(-1, $GUI_DOCKSIZE)? :blink: Нет ли более простого решения? :scratch:
Ну, например, GUICtrlSetResizing с параметром $GUI_DOCKSIZE для ВСЕХ элементов сразу? ;D
 

AZJIO

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

Код:
Opt("GUIResizeMode", 2 + 32 + 256 + 512) ; 802


в начало скрипта поставь, это будет общее для всех элементов, для которых индивидуально не указан GUICtrlSetResizing.
 
Верх