Tải bản đầy đủ (.pdf) (5 trang)

GIỚI THIỆU VỀ AUTOIT-Lập Trình Trên AutoIT part 30 docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (131.05 KB, 5 trang )

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

×