Тема: AHK: GUI запоминает свои размеры-положение в ini
Здравствуйте.
Скажите - можно ли заставить GUI окно - запоминать положение и размеры окна - перед закрытием (в ini-файл) ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Скажите - можно ли заставить GUI окно - запоминать положение и размеры окна - перед закрытием (в ini-файл) ?
Можно.
GuiClose:
GuiEscape:
If (A_GuiWidth > 0) and (A_GuiHeight > 0) ; запрет 0 значений иначе проблемы:
{
W = %A_GuiWidth%
H = %A_GuiHeight%
}
Name - Титул окна GUI.
WinGetPos,X,Y,W,H, %Name% ahk_class AutoHotkeyGUI
__Михаил__, а как запустить этот скрипт?
Запускают скрипт:
WinGetPos,X,Y,W,H, %Безымянный — Блокнот% ahk_class AutoHotkeyGUI
GuiClose:
GuiEscape:
If (A_GuiWidth > 0) and (A_GuiHeight > 0) ; запрет 0 значений иначе проблемы:
{
W = %A_GuiWidth%
H = %A_GuiHeight%
}
Пишет ошибку:
Error at line1
The following variable name contains an illegal character
Megamen
1) Синтаксическая ошибка, не нужно ставить знаки '%'. Нужно указать титул окна как есть.
Я привёл переменную, которую можно подставить (Name).
2) Если это весь скрипт - то он не будет работать. Необходимо ещё создать окно Gui.
__Михаил__,
Сделал вот так:
Создал окно Gui, убрал знаки '%'
Gui, Show, Restore w300 h200
WinGetPos,X,Y,W,H, окно.ahk, ahk_class AutoHotkeyGUI
GuiClose:
GuiEscape:
If (A_GuiWidth > 0) and (A_GuiHeight > 0) ; запрет 0 значений иначе проблемы:
{
W = %A_GuiWidth%
H = %A_GuiHeight%
}
Просто отображается окно - и больше ничего.
Но его невозможно мышкой растягивать и непонятно, как оно записывает размеры-координаты в ini.
Resize: позволяет изменять размер окна и разрешает кнопку максимизации в строке заголовка. Чтобы избежать разрешения кнопки максимизации, задайте +Resize -MaximizeButton.
Gui,+resize
Gui, Show,w300 h200
Alectric, я поправил скрипт.
Теперь он такой:
Gui,+resize
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, высота, H
Gui, Show,w300 h200
WinGetPos,X,Y,W,H, окно.ahk, ahk_class AutoHotkeyGUI
GuiClose:
GuiEscape:
If (A_GuiWidth > 0) and (A_GuiHeight > 0) ; запрет 0 значений иначе проблемы:
{
W = %A_GuiWidth%
H = %A_GuiHeight%
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, ширина, W
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, высота, H
}
Теперь окно может растягиваться, но ничего в ini - не записывает.
A_GuiWidth
A_GuiHeight Данные переменные при обращении к ним из подпрограммы GuiSize содержат ширину и высоту окна GUI, инициировавшего подпрограмму. Относятся они к размерам клиентской области, которая включает области заголовка, меню и рамку.
Переменные A_GuiWidth, A_GuiHeight не будут работать в любом месте скрипта, а только при использовании метки GuiSize.
GuiSize:
W:=a_guiwidth
H:=a_guiheight
return
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, высота, H
Здесь запись значений происходит в одну и туже переменную. И далее эти переменные нигде не используются. Их нужно подставить вместо размера создаваемого окна (w300 h200).
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, высота,H
Здесь вместо "Это новое значение" нужно подставлять переменные которые содержат соответствующие размеры окна.
Чтобы проверить содержимое переменной можно использовать MsgBox.
MsgBox,%W%
Чтобы программа закрывалась при закрытии окна нужно добавить "ExitApp".
Gui,+resize
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, OutputVar, %A_ScriptDir%\параметры.ini, высота, H
Gui, Show,w300 h200
return
GuiSize:
W:=a_guiwidth
H:=a_guiheight
return
GuiClose:
GuiEscape:
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, Это новое значение, %A_ScriptDir%\параметры.ini, высота,H
exitapp
Alectric, вот я написал такую вещь:
Gui,+resize
IniRead, W, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, H, %A_ScriptDir%\параметры.ini, высота, H
IniRead, X, %A_ScriptDir%\параметры.ini, коордX, X
IniRead, Y, %A_ScriptDir%\параметры.ini, коордY, Y
Gui, Show,x%X% y%Y% w%W% h%H%
return
WinGetPos,X,Y,W,H, 111.ahk, ahk_class AutoHotkeyGUI
GuiSize:
W:=a_guiwidth
H:=a_guiheight
X:=a_guix
Y:=a_guiy
return
GuiClose:
GuiEscape:
IniWrite, %W%, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, %H%, %A_ScriptDir%\параметры.ini, высота,H
IniWrite, %X%, %A_ScriptDir%\параметры.ini, коордX,X
IniWrite, %Y%, %A_ScriptDir%\параметры.ini, коордY,Y
exitapp
Но не работает этот код - не хочет сохранять координаты окна в ini (все время пустые места там оставляет).
GuiContextMenu [v1.0.36+]:
A_GuiX и A_GuiY, содержащие координаты X и Y того места в окне, где скрипт должен отобразить меню, например:
Эти две переменные не относятся к метке GuiSize.
Тогда проще использовать WinGetPos.
Также лучше использовать уникальный идентификационный номер (HWND/handle) для работы с окнами вместо его имени.
Gui,+resize
Gui,+hwndhMainWinID ; берем хендл окна в переменную hMainWinID
IniRead, W, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, H, %A_ScriptDir%\параметры.ini, высота, H
IniRead, X, %A_ScriptDir%\параметры.ini, коордX, X
IniRead, Y, %A_ScriptDir%\параметры.ini, коордY, Y
Gui, Show,x%X% y%Y% w%W% h%H%
return
GuiClose:
GuiEscape:
WinGetPos,X,Y,W,H,ahk_id %hMainWinID%
IniWrite, %W%, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, %H%, %A_ScriptDir%\параметры.ini, высота,H
IniWrite, %X%, %A_ScriptDir%\параметры.ini, коордX,X
IniWrite, %Y%, %A_ScriptDir%\параметры.ini, коордY,Y
exitapp
Тогда проще использовать WinGetPos
А вот и не угадали. WinGetPos даёт внешние размеры окна, а Gui, Show устанавливает внутренние. Всё же надо приобрести привычку проверять скрипт перед тем, как постить. Вы удивитесь, но я так всегда делаю.
Проверяю. Просто я недостаточно внимателен, не знаю что с собой поделать на этот счет. Запустил - размеры сохраняет загружает, а то что на пару пикселей сдвинулось не заметил.
Alectric, спасибо - вроде все работает.
WinGetPos даёт внешние размеры окна, а Gui, Show устанавливает внутренние.
Запустил - размеры сохраняет загружает, а то что на пару пикселей сдвинулось не заметил.
Alectric, Скажите - а как в этом скрипте - поставить надежные размеры и координаты окна - чтобы не было этого смещения на пару пикселей ?
Потому что при частом использовании - размеры окна все больше искажаются и цель скрипта теряет свой смысл.
Gui,+resize
Gui,+hwndhMainWinID ; берем хендл окна в переменную hMainWinID
IniRead, W, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, H, %A_ScriptDir%\параметры.ini, высота, H
IniRead, X, %A_ScriptDir%\параметры.ini, коордX, X
IniRead, Y, %A_ScriptDir%\параметры.ini, коордY, Y
Gui, Show,x%X% y%Y% w%W% h%H%
return
guisize:
W:=a_guiwidth
H:=a_guiheight
return
GuiClose:
GuiEscape:
WinGetPos,X,Y,,,ahk_id %hMainWinID%
IniWrite, %W%, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, %H%, %A_ScriptDir%\параметры.ini, высота,H
IniWrite, %X%, %A_ScriptDir%\параметры.ini, коордX,X
IniWrite, %Y%, %A_ScriptDir%\параметры.ini, коордY,Y
exitapp
А так не сработает, если выйти из скрипта через трей-меню.
Alectric, ясно.
А как сразу - без дополнительных корректировок в виде
guisize:
W:=a_guiwidth
H:=a_guiheight
return
надежно без смещения установить размеры и координаты gui (одной командой при открытии) ?
Или можно "guisize:" каким-то другим способом ввести - без знака ":" (не циклом, а простой командой) ?
Например guisize, W:=a_guiwidth, H:=a_guiheight
Gui,+resize
Gui,+hwndhMainWinID ; берем хендл окна в переменную hMainWinID
IniRead, W, %A_ScriptDir%\параметры.ini, ширина, W
IniRead, H, %A_ScriptDir%\параметры.ini, высота, H
IniRead, X, %A_ScriptDir%\параметры.ini, коордX, X
IniRead, Y, %A_ScriptDir%\параметры.ini, коордY, Y
Gui, Show
winmove,ahk_id %hMainWinID%,,x,y,w,h
return
GuiClose:
GuiEscape:
WinGetPos,X,Y,W,H,ahk_id %hMainWinID%
IniWrite, %W%, %A_ScriptDir%\параметры.ini, ширина,W
IniWrite, %H%, %A_ScriptDir%\параметры.ini, высота,H
IniWrite, %X%, %A_ScriptDir%\параметры.ini, коордX,X
IniWrite, %Y%, %A_ScriptDir%\параметры.ini, коордY,Y
exitapp
А зачем именно хэндл нужно брать в переменную ?
Можно использовать title, вместо хэндла ?
Alectric, напишите свой адрес электронной почты.
Хочу спросить о другом скрипте.
зачем именно хэндл
Затем что это:
уникальный идентификационный номер (HWND/handle)
100% скрипт не перепутает окно с другим, если title совпадет, или если ты несколько таких же окон создашь, запустишь один и тот-же скрипт несколько раз.
Можно использовать title, вместо хэндла ?
Можно.
Хочу спросить о другом скрипте.
Спрашивай на форуме. Знаешь, как бывает: сегодня у меня есть настроение помочь, а завтра нет.
Хочу спросить о другом скрипте.
Спрашивай на форуме.
Я денег заплачу.
Я денег заплачу.
Мне зарплаты хватает. Возможно тут есть кто-то кому не хватает, пиши им.
Megamen, если хотите заказать скрипт за плату, у нас есть Коммерческий раздел. Если хотите обратиться к кому-либо лично, есть чат (кнопка вверху справа).
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться