Thông thường một vòng lặp khép kín như trên sẽ làm cho tần suất CPU lên 100% (xem trong task manager) – nhưng may mắn là hàm GUIGetMsg sẽ tự động tạo ra khoảng dừng và giảm tải CPU trong khi chờ đợi sự kiện. Cho nên bạn không cần phải đặt bất kỳ một lệnh sleep hay lệnh trì hoãn nào ở đây bởi vì việc này sẽ làm cho GUI của bạn không phản ứng với các sự kiện. Các sự kiện của GUI Có ba loại thông điệp sự kiện mà GUIGetMsg sẽ trả về : - No Event - Control Event - System Event No Event Khi không có sự kiện nào xảy ra , hàm GUIGetMsg sẽ trả về giá trị 0. Đây là sự kiện phổ biến nhất trong các GUI thông thường Control Event Khi một control được click hoặc thay đổi thì một sự kiện sẽ được gửi đi , sự kiện này xảy ra trên control nên được gọi là Control Event . Thường thì sự kiện này là một số nguyên dương cho biết controlID (định danh của control trên GUI, được tạo ra bởi hàm GUICtrlCreate ) nào đang/vừa được tương tác System Event Các sự kiện hệ thống – như đóng một GUI – là một số âm . Các sự kiện khác nhau được định nghĩa trong thư viện GUIConstantsEx.au3. Dưới đây là các sự kiện phổ biến thường hay dùng : $GUI_EVENT_CLOSE $GUI_EVENT_MINIMIZE $GUI_EVENT_RESTORE $GUI_EVENT_MAXIMIZE $GUI_EVENT_PRIMARYDOWN $GUI_EVENT_PRIMARYUP $GUI_EVENT_SECONDARYDOWN $GUI_EVENT_SECONDARYUP $GUI_EVENT_MOUSEMOVE $GUI_EVENT_RESIZED $GUI_EVENT_DROPPED Ví dụ GUI Ở đây chúng ta sẽ bắt đầu với chương trình hello world đơn giản như sau : #include <GUIConstantsEx.au3> GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) Sleep(2000) Đoạn chương trình trên sẽ hiển thị một cửa sổ với một dòng văn bản "Hello world ! How are you ? " , một nút bấm và sẽ thoát sau 2 giây. Và bây giờ chúng ta sẽ hoàn tất chương trình trên bằng việc sử dụng vòng lặp thông điệp , lúc này bạn sẽ thấy mọi thứ linh động và hữu ích hơn. #include <GUIConstantsEx.au3> GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $okbutton MsgBox(0, "GUI Event", "You pressed OK!") Case $msg = $GUI_EVENT_CLOSE MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting ") ExitLoop EndSelect WEnd Mọi thứ như bạn thấy đấy , thật dễ dàng. Bạn có thể tạo cửa sổ và các control rồi thêm vào các mệnh lệnh cho chúng xử lý. Tuy nhiên đây chỉ là một ví dụ rất đơn giản nhưng cũng rất cơ bản và bạn nên hiểu rõ. Khi thành thạo bạn có thể làm ra những thứ khác hay hơn nhiều. GUIGetMsg nâng cao và chế độ nhiều cửa sổ Các định danh (ID) của control là duy nhất , thậm chí khi bạn có nhiều cửa sổ thì đoạn mã của bạn vẫn sẽ làm việc tốt . Tuy nhiên , khi xử lý các sự kiện như $GUI_EVENT_CLOSE hoặc $GUI_MOUSEMOVE bạn cần phải biết được GUI nào đã phát ra thông điệp này để mà ra lệnh cho đúng. Giả sử rằng bạn vừa tạo ra hai cửa sổ và chỉ muốn thoát chương trình khi cửa sổ thứ nhất gửi đi thông điệp Close, nếu cửa sổ thứ hai cũng phát thông điệp Close thì chỉ ẩn GUI đi, chứ không thoát ứng dụng. Muốn làm được điều này bạn phải gọi GUIGetMsg giống như sau : $msg = GUIGetMsg(1) Khi gọi với tham số là 1 , giá trị trả về bây giờ không còn là một số nguyên nữa mà thay vào đó là một mảng. Sự kiện nào vừa xảy ra sẽ được lưu trong phần tử đầu tiên ($array[0]) và thông tin bổ sung như handle của cửa sổ đã phát ra sự kiện sẽ được lưu trong phần tử thứ hai ($array[1]) . Ví dụ ở trên sẽ được sửa lại để làm việc với hai cửa sổ và bạn sẽ hiểu cách viết mã xử lý chúng như thế nào . #include <GUIConstantsEx.au3> $mainwindow = GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) $dummywindow = GUICreate("Dummy window for testing ", 200, 100, -1, 100) GUISetState(@SW_SHOW, $dummywindow) GUISwitch($mainwindow) GUISetState() While 1 $msg = GUIGetMsg(1) Select Case $msg[0] = $okbutton MsgBox(0, "GUI Event", "You pressed OK!") Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow MsgBox(0, "GUI Event", "You clicked CLOSE on the main window! Exiting ") ExitLoop EndSelect WEnd Đầu tiên , có một sự thay đổi quan trọng là việc xuất hiện của hàm GUISwitch – khi một cửa-sổ-mới (new window) được tạo ra thì nó trở thành cửa sổ mặc định cho các thao tác của GUI trong tương lai (bao gồm việc tạo control). Trong ví dụ này , chúng ta muốn làm việc với của sổ chính "Hello world" , không phải cửa sổ dummy , nên phải switch về cửa sổ chính. Một vài hàm về GUI cho phép bạn sử dụng handle cửa sổ trong tham số để tự động chuyển sang GUI cần chứa control mà không cần phải dùng đến lệnh GUISwitch. Và chúng ta đã có một trường hợp trong đoạn code trên : GUISetState(@SW_SHOW, $dummywindow) Sự thay đổi tiếp theo là cách gọi hàm GUIGetMsg và kiểm tra các sự kiện – để ý việc dùng $msg[0] và $msg[1] – bây giờ chúng ta sẽ thoát khỏi chương trình khi event Close được gởi đi và nó phải xuất phát từ cửa sổ chính. CHẾ ĐỘ OnEvent Trong chế độ OnEvent , việc xử lý các sự kiện xảy ra trên GUI không phải bằng cách dò xét liên tục bằng một vòng lặp khép kín nữa , mà thay vào đó là việc tạm dừng đoạn script và gọi một hàm đã được định nghĩa trước đó dành cho một sự kiện với một control tương ứng. Ví dụ như người dùng nhấp vào nút Button1 thì đoạn chương trình chính của bạn nhất thời sẽ ngưng lại để gọi hàm đã tạo trước đó dành cho Button1. Sau khi hàm đã hoàn tất công việc của nó thì đoạn chương trình chính của bạn sẽ chạy tiếp. Chế độ này tương tự như trong phương thức xử lý form của Visual Basic. Khi một GUI đang thực thi, đoạn chương trình chính của bạn có thể làm bất cứ công việc gì , nhưng để tạo nên sự đơn giản cho các ví dụ , chúng ta sẽ tạo nên một vòng lặp While với khoảng dừng bên trong. Theo mặc định , GUI luôn được xử lý theo chế độ vòng lặp thông điệp. Vì vậy để chuyển sang chế độ OnEvent ở đầu đoạn mã chúng ta phải sử dung Opt("GUIOnEventMode", 1). Dạng OnEvent cơ bản Dạng tổng quát có thể trình bày như sau : While 1 Sleep(1000) ; khoảng dừng của vòng lặp WEnd Func Event1() ; Code to handle event goes here EndFunc Func Event2() ; Code to handle event goes here EndFunc GUI Events Trong chế độ OnEvent , GUI của bạn sẽ phát ra các sự kiện sau : - Control Event - System Event Cả hai loại sự kiện trên sẽ gọi một hàm do người viết chương trình thiết lập , hàm này có thể được chỉ định cho GUI (sử dụng hàm GUISetOnEvent) hoặc chỉ định xử lý cho control (sử dụng hàm GUICtrlSetOnEvent) . Nếu một sự kiện nào đó xảy ra mà AutoIt không tìm thấy hàm làm việc tương ứng thì nó sẽ bị bỏ qua. Bên . thông điệp sự kiện mà GUIGetMsg sẽ trả về : - No Event - Control Event - System Event No Event Khi không có sự kiện nào xảy ra , hàm GUIGetMsg sẽ trả về giá trị 0. Đây là sự kiện phổ biến. gửi đi , sự kiện này xảy ra trên control nên được gọi là Control Event . Thường thì sự kiện này là một số nguyên dương cho biết controlID (định danh của control trên GUI, được tạo ra bởi hàm. GUICtrlCreateLabel("Hello world! How are you?", 30, 10) GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) Sleep(2000) Đoạn chương trình trên sẽ hiển thị một cửa sổ với một dòng