GUI 的概念
GUI 可由一個或多個 視窗 組成,這些視窗又帶有一個或多個控制項。GUI是靠“事件驅動”實現與使用者的互動的,比如像點擊按鈕這樣的動作就會引發一個事件。程式在空閑狀態時等待事件的發生,捕捉到事件時則根據事件執行相關操作。您可以猜想自己在門邊等郵差(一直坐在那兒直到有信被送進來為止),等郵差把信送來了,您就要閱讀該信並決定下一步做什麼,這就跟GUI的原理一樣了:您等待的是郵差,而GUI則等待事件,
當然,在GUI(指程式的介面)運行時您也可以選擇要做的其它任務,比如使用GUI函數建立一個自動更新的動態進度條,同時還可執行其它複雜的任務。
GUI 的控制項
所有使用者應該都對控制項非常瞭解了,在視窗上能被點擊或進行其它互動的部分都是控制項的一種。AutoIt 可建立的控制項類型有如下幾種(您肯定已在其它Windows程式中見過它們了):
| Label |
純文字控制項 |
| Button |
按鈕 |
| Input |
單行編輯框,可供輸入文字 |
| Edit |
多行編輯框,可供輸入文字 |
| Checkbox |
方框按鈕,可被選中或取消選中 |
| Radio |
圓形按鈕(通常幾個一組,每次只能啟用/選中其中一個) |
| Combo |
組合框,帶有下拉式清單 |
| List |
列表框 |
| Date |
日期選擇 |
| Pic |
圖片 |
| Icon |
表徵圖 |
| Progress |
進度條 |
| Tab |
標籤,每個標器都可包含一組控制項 |
| UpDown |
可附加到輸入型控制項上 |
| Avi |
顯示 AVI 格式的剪輯 |
| Menu |
位於視窗頂部的菜單 |
| ContextMenu |
當在視窗上點擊右鍵時出現的菜單 |
| TreeView |
類似於Windows的資源管理員(樹型視圖) |
| Slider |
類似於Windows的音量控制項(滑動條) |
| ListView |
按列顯示資訊的控制項(列表視圖) |
| ListViewItem |
ListView控制項的項目 |
| Dummy |
虛擬使用者控制項 |
下面是一個單視窗的GUI樣本,它包含了許多被AutoIt支援的控制項。從中我們可以看到 AutoIt 確實可以建立內容非常豐富的GUI!
使用 GUICtrlCreate... 等函數即可建立控制項。在建立時函數會返回 控制項ID。關於控制項ID有幾個注意事項:
控制項ID是一個正數(意即該數大於0)
每個控制項ID都具有唯一性(即使有多個視窗存在)。
控制項ID可通過 AutoIt Window Info 獲得。GUI 基本函數下面這些就是可用於建立GUI的函數。但這些都是比較初級的應用,如果您已經準備好建立更進階的GUI,則還有其它進階的函數。
| 函數 |
解釋 |
| GUICreate |
建立一個視窗。 |
| GUICtrlCreate... |
建立各種控制項。 |
| GUISetState |
顯示或隱藏視窗。 |
| GUIGetMsg |
通知GUI檢測是否有事件發生(僅用於訊息迴圈)。 |
| GUICtrlRead |
讀取控制項資料。 |
| GUICtrlSetData |
設定/更改 控制項的資料。 |
| GUICtrlSet... |
對控制項進行各種屬性設定(顏色、風格等等)。 |
在您著手編寫任何GUI指令碼之前別忘了先包含檔案 GUIConstants.au3 到指令碼開頭位置(該檔案包含了在編寫GUI程式時要用到的所有變數和常量)。
讓我們先來建立一個視窗吧,把它命名為“您好”,設定其長寬分別為200和100個象素。當視窗被建立時它是被隱藏的,所以我們還要先把它給“show(顯示)”出來。
#include <GUIConstants.au3>
GUICreate("您好", 200, 100)
GUISetState(@SW_SHOW)
Sleep(2000)
如果運行上面的指令碼您會看到出現一個視窗並在兩秒後消失。看來還不是很有意思哦...那讓我們嘗試增加一些文字和一個確定按鈕到視窗上吧!我們把文字加到 30, 10 這個位置並把按鈕放到 70, 50 這個位置,按鈕寬度設為60個象素。
#include <GUIConstants.au3>
GUICreate("您好", 200, 100)
GUICtrlCreateLabel("最近過得怎樣?", 30, 10)
GUICtrlCreateButton("還OK吧", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
好,現在看來還不錯。但是怎樣使這個GUI能響應我們點擊按鈕的事件呢?這時我們必須先決定究竟如何處理事件:要麼通過 訊息迴圈(MessageLoop) 要麼通過 OnEvent 函數。
GUI 事件模式正如上面所提到的那樣,我們有兩種基本的GUI模式:訊息迴圈(MessageLoop)模式和 OnEvent 模式。這兩種模式是響應GUI事件的不同的實現方式。具體選擇哪一種模式主要看您的 個人喜好 或者您想要建立的GUI類型。這兩種模式都能用於建立任何您想要的GUI,只不過某些時候使用其中一個會比另外一個要好用些。
訊息迴圈是預設的模式。若要切換為 OnEvent 模式請使用 Opt("GUIOnEventMode", 1) 語句。
訊息迴圈模式(預設)
在訊息迴圈模式下,指令碼大部分時間都在執行一個周期非常短的迴圈,這個迴圈通知GUI使用 GUIGetMsg (截獲訊息)函數。當某個事件發生時 GUIGetMsg 函數把訊息作為返回數值返回(比如某個按鈕被按下、GUI被關閉,等等)。
在此模式下,只有當我們頻繁地使用 GUIGetMsg 函數時才有可能接收到事件,因此您必須確保在每一秒內都有數次調用該函數,否則您的 GUI 將無法響應事件。
這一模式最適合用於那些以 GUI 為重點的指令碼中,並且您最關心的就是等待使用者事件。
如需瞭解關於 訊息迴圈模式 的更詳細的解釋請到 此頁 查看。
OnEvent 模式
在OnEvent模式下,指令碼並不需要頻繁地要求GUI檢查是否有任何事件發生(並根據返回資訊處理事件),而是僅當某個事件發生時GUI才臨時性暫停指令碼並調用一個使用者預定義的函數來處理該事件。例如,假定使用者點擊了按鈕1則GUI將暫停主指令碼並調用某個預定義的使用者函數來處理按鈕1事件。當該函數完成處理操作後才回到主指令碼繼續執行。這個模式比較類似 Visual Basic 的表單方法。
這一模式最適合用於那些 GUI 處於第二重要地位的指令碼中,並且您的指令碼需要優先執行其它任務。
如需瞭解關於 OnEvent模式 的更詳細的解釋請到 此頁 查看。