BOOKER
к сожалению, делать GUI - научить сложно. собственный опыт в этом деле куда полезнее.
азы можешь почитать в справке, в разделе GUI References.
если вкратце, то в AutoIt GUI рисуется посредством команды
GUICreate("Window title", $width, $height)
она создает пусто окно с заголовком Window title, шириной $width, высотой $height (они должны быть заранее определены, или вместо них могут стоять явно числа не превышающие ширину и высоту рабочего стола, для возможности полного отображения на мониторе). Он будет пуст и состоять лишь из заголовка и системных кнопок. Только его будет не видно. Чтобы его увидеть, нужно состояние окна, которое "скрытое" по умолчанию, перевести в режим "видимое".
$hMain = GUICreate("Window title", 200, 200)
GUISetState()
Только теперь, окно появится на мгновение и сразу же исчезнет. Почему? Потому что AutoIt - интерпретируемый язык сценариев. То есть он берет все команды прописанные в файле и начинает делать по порядку строку за строкой. А в этих двух строках написано -
1. Нарисуй окно с такими-то заголовком, шириной и высотой
2. Сделай его видимым
Он это сделал и вышел, т.к. других команд нет. Для того чтобы лицезреть это окно нужно заставить скрипт выполнять что-нибудь "другое" не очень навязчивое, и не мешающее просмотру нашего окна. Одним из таких способов - запустить после прорисовки "вечный" цикл.
$hMain = GUICreate("Window title", 200, 200)
GUISetState()
Do
Until False
Но! Это не эстетично. Потому что а) чтобы выйти из скрипта нужно "убить процесс" либо из трея, либо из диспетчера задач; б) цикл грузит ядро/процессор на 100%.
Для выхода из п. б) можно добавить паузу в цикле
$hMain = GUICreate("Window title", 200, 200)
GUISetState()
Do
Sleep(10)
Until False
Для решения п. а) нужно все же почитать справку. Там в частности указано, что при нажатии на клавишу ESC или системную кнопку (X) - выход, генерируется сообщение $GUI_EVENT_CLOSE (можно использовать эту константу, подключив предварительно библиотеку GUIConstantsEx.au3) либо ее явное значение -
-3 (Кстати говоря вставка в цикл функции GUIgetMsg() позволяет избавится от паузы, то есть одновременно решая и п.б) )
Сообщения регистрируются скриптом посредством команды
Поэтому простейший скрипт, рисования окна, не грузящий процессор и реагирующий на нажатия клавишы выхода будет выглядеть примерно следующим образом.
$hMain = GUICreate("Window title", 200, 200)
GUISetState()
Do
$msg = GUIGetMsg()
Until $msg = -3
После этого почитай справку на тему контролов. Контролы - это дальнейшее развитие твоего окна, это его элементы. Кнопки, поля для ввода, чекбосы и радиокнопки, куски текста и прочее. Полный список в справке. При нажатии на контрол генерируется сообщение, равное внутреннему идентификатору этого контрола - "хендлу" (англ. Handle), которое ты можешь регулировать при помощи переменной, которой присваиваешь возвращаемое значение при создании того или иного контрола. К примеру, если создается кнопка командой
GUICtrlCreateButton("Push me", 50, 50)
то его хендл будет утерян, т.к. нет ссылки на него. Поэтому его нужно создать так
$hButton = GUICtrlCreateButton("Push me", 50, 50)
Теперь хендл созданной кнопки хранится в переменной $hButton. А проверка - сгенерировалось ли сообщение равное этому хендлу, а попросту говоря - нажалась ли кнопка с текстом "Push me" нужно просто проверить равенство
и если нажалась, то выполнить какое-либо действие. Пусть этим действием будет вывод MsgBox(0, "I Win", "Hurray!"). Тогда код выше с одной кнопкой, выводящий это сообщение будет как указано ниже
$hMain = GUICreate("Window title", 200, 200)
$hButton = GUICtrlCreateButton("Push me", 50, 50)
GUISetState()
Do
$msg = GUIGetMsg()
If $msg = $hButton Then
MsgBox(0, "I Win", "Hurray!")
EndIf
Until $msg = -3
То есть все построение GUI сводится к грамотному оформлению операторов условия внутри вечного цикла. Нужно правильно организовать перехват сообщений при тех или иных событиях. Хочу еще отметить, что внутри цикла после нажатия на кнопку $hButton можно не только явно прописать какие-то действия типа MsgBox но и отдельные функции, определенные тобой в скрипте через
Func MyFunc($arg)
; Some actions
EndFunc