AutoIt 腳本可創(chuàng)建(由窗口及其控件組成的)簡(jiǎn)單的圖形用戶界面(GUI)。
GUI 可由一個(gè)或多個(gè) 窗口 組成,這些窗口又帶有一個(gè)或多個(gè)控件。GUI是靠“事件驅(qū)動(dòng)”實(shí)現(xiàn)與用戶的交互的,比如像點(diǎn)擊按鈕這樣的動(dòng)作就會(huì)引發(fā)一個(gè)事件。程序在空閑狀態(tài)時(shí)等待事件的發(fā)生,捕捉到事件時(shí)則根據(jù)事件執(zhí)行相關(guān)操作。您可以猜想自己在門邊等郵差(一直坐在那兒直到有信被送進(jìn)來(lái)為止),等郵差把信送來(lái)了,您就要閱讀該信并決定下一步做什么,這就跟GUI的原理一樣了:您等待的是郵差,而GUI則等待事件,
當(dāng)然,在GUI(指程序的界面)運(yùn)行時(shí)您也可以選擇要做的其它任務(wù),比如使用GUI函數(shù)創(chuàng)建一個(gè)自動(dòng)更新的動(dòng)態(tài)的進(jìn)度條,同時(shí)還可執(zhí)行其它復(fù)雜的任務(wù)。
所有用戶應(yīng)該都對(duì)控件非常了解了,在窗口上能被點(diǎn)擊或進(jìn)行其它交互的部分都是控件的一種。AutoIt 可創(chuàng)建的控件類型有如下幾種(您肯定已在其它Windows程序中見過(guò)它們了):
純文字控件 | |
按鈕 | |
單行編輯框,可供輸入文字 | |
多行編輯框,可供輸入文字 | |
方框按鈕,可被選中或取消選中 | |
圓形按鈕(通常幾個(gè)一組,每次只能激活/選中其中一個(gè)) | |
組合框,帶有下拉列表 | |
列表框 | |
日期選擇 | |
圖片 | |
圖標(biāo) | |
進(jìn)度條 | |
標(biāo)簽,每個(gè)標(biāo)器都可包含一組控件 | |
可附加到輸入型控件上 | |
顯示 AVI 格式的剪輯 | |
位于窗口頂部的菜單 | |
當(dāng)在窗口上點(diǎn)擊右鍵時(shí)出現(xiàn)的菜單 | |
類似于Windows的資源管理器(樹型視圖) | |
類似于Windows的音量控件(滑動(dòng)條) | |
按列顯示信息的控件(列表視圖) | |
ListView控件的項(xiàng)目 | |
虛擬的用戶控件 |
下面是一個(gè)單窗口的GUI示例,它包含了許多被AutoIt支持的控件。從中我們可以看到 AutoIt 確實(shí)可以創(chuàng)建內(nèi)容非常豐富的GUI!
使用 GUICtrlCreate... 等函數(shù)即可創(chuàng)建控件。在創(chuàng)建時(shí)函數(shù)會(huì)返回 控件ID。關(guān)于控件ID有幾個(gè)注意事項(xiàng):
下面這些就是可用于創(chuàng)建GUI的函數(shù)。但這些都是比較初級(jí)的應(yīng)用,如果您已經(jīng)準(zhǔn)備好創(chuàng)建更高級(jí)的GUI,則還有其它高級(jí)的函數(shù)。
函數(shù) | 解釋 |
GUICreate | 創(chuàng)建一個(gè)窗口。 |
GUICtrlCreate... | 創(chuàng)建各種控件。 |
GUISetState | 顯示或隱藏窗口。 |
GUIGetMsg | 通知GUI檢測(cè)是否有事件發(fā)生(僅用于消息循環(huán))。 |
GUICtrlRead | 讀取控件數(shù)據(jù)。 |
GUICtrlSetData | 設(shè)置/更改 控件的數(shù)據(jù)。 |
GUICtrlSet... | 對(duì)控件進(jìn)行各種屬性設(shè)置(顏色、風(fēng)格等等)。 |
在您著手編寫任何GUI腳本之前別忘了先包含文件 GUIConstants.au3 到腳本開頭位置(該文件包含了在編寫GUI程序時(shí)要用到的所有變量和常量)。
讓我們先來(lái)創(chuàng)建一個(gè)窗口吧,把它命名為“您好”,設(shè)置其長(zhǎng)寬分別為200和100個(gè)象素。當(dāng)窗口被創(chuàng)建時(shí)它是被隱藏的,所以我們還要先把它給“show(顯示)”出來(lái)。
#include <GUIConstants.au3>
GUICreate("您好", 200, 100)
GUISetState(@SW_SHOW)
Sleep(2000)
如果運(yùn)行上面的腳本您會(huì)看到出現(xiàn)一個(gè)窗口并在兩秒后消失?磥(lái)還不是很有意思哦...那讓我們嘗試增加一些文字和一個(gè)確定按鈕到窗口上吧!我們把文字加到 30, 10 這個(gè)位置并把按鈕放到 70, 50 這個(gè)位置,按鈕寬度設(shè)為60個(gè)象素。
#include <GUIConstants.au3>
GUICreate("您好", 200, 100)
GUICtrlCreateLabel("最近過(guò)得怎樣?", 30, 10)
GUICtrlCreateButton("還OK吧", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
好,現(xiàn)在看來(lái)還不錯(cuò)。但是怎樣使這個(gè)GUI能響應(yīng)我們點(diǎn)擊按鈕的事件呢?這時(shí)我們必須先決定究竟如何處理事件:要么通過(guò) 消息循環(huán)(MessageLoop) 要么通過(guò) OnEvent 函數(shù)。
正如上面所提到的那樣,我們有兩種基本的GUI模式:消息循環(huán)(MessageLoop)模式和 OnEvent 模式。這兩種模式是響應(yīng)GUI事件的不同的實(shí)現(xiàn)方式。具體選擇哪一種模式主要看您的 個(gè)人喜好 或者您想要?jiǎng)?chuàng)建的GUI類型。這兩種模式都能用于創(chuàng)建任何您想要的GUI,只不過(guò)某些時(shí)候使用其中一個(gè)會(huì)比另外一個(gè)要好用些。
消息循環(huán)是默認(rèn)的模式。若要切換為 OnEvent 模式請(qǐng)使用 Opt("GUIOnEventMode", 1) 語(yǔ)句。
消息循環(huán)模式(默認(rèn))
在消息循環(huán)模式下,腳本大部分時(shí)間都在執(zhí)行一個(gè)周期非常短的循環(huán),這個(gè)循環(huán)通知GUI使用 GUIGetMsg (截獲消息)函數(shù)。當(dāng)某個(gè)事件發(fā)生時(shí) GUIGetMsg 函數(shù)把消息作為返回?cái)?shù)值返回(比如某個(gè)按鈕被按下、GUI被關(guān)閉,等等)。
在此模式下,只有當(dāng)我們頻繁地使用 GUIGetMsg 函數(shù)時(shí)才有可能接收到事件,因此您必須確保在每一秒內(nèi)都有數(shù)次調(diào)用該函數(shù),否則您的 GUI 將無(wú)法響應(yīng)事件。
這一模式最適合用于那些以 GUI 為重點(diǎn)的腳本中,并且您最關(guān)心的就是等待用戶事件。
如需了解關(guān)于 消息循環(huán)模式 的更詳細(xì)的解釋請(qǐng)到 此頁(yè) 查看。
OnEvent 模式
在OnEvent模式下,腳本并不需要頻繁地要求GUI檢查是否有任何事件發(fā)生(并根據(jù)返回信息處理事件),而是僅當(dāng)某個(gè)事件發(fā)生時(shí)GUI才臨時(shí)性暫停腳本并調(diào)用一個(gè)用戶預(yù)定義的函數(shù)來(lái)處理該事件。例如,假定用戶點(diǎn)擊了按鈕1則GUI將暫停主腳本并調(diào)用某個(gè)預(yù)定義的用戶函數(shù)來(lái)處理按鈕1事件。當(dāng)該函數(shù)完成處理操作后才回到主腳本繼續(xù)執(zhí)行。這個(gè)模式比較類似 Visual Basic 的窗體方法。
這一模式最適合用于那些 GUI 處于第二重要地位的腳本中,并且您的腳本需要優(yōu)先執(zhí)行其它任務(wù)。
如需了解關(guān)于 OnEvent模式 的更詳細(xì)的解釋請(qǐng)到 此頁(yè) 查看。