[GUI & Code] Phần 12: Multi GUI - Đa giao diện người dùng


Giới thiệu
Multi GUI - Đa GUI trong một code luôn là vấn đề nan giải với mấy cha tự học code qua việc vọc vẹc mà không xem video hướng dẫn về những cái cơ bản (ví dụ như mình). Việc đó đã trở nên thành một cái lỗ hỏng kiến thức hơi bị lớn. Vì sao? Vì nếu bạn muốn lập trình một phần mềm hay, độc đáo, "to bự" thì đòi hỏi cần phải sử dụng đến nhiều hơn 1 GUI trong code.

Nói vậy được rồi, ngắn ngọn, xúc xích thôi rồi vào bài nào.

Đa GUI thì các bác có thể làm được nhưng cái quan trọng là phần While của code (đối với mấy bác tạo GUI bằng Koda) hay như em. Chắc chỉ có riêng em là tự huấn luyện mình thôi :v nên kiến thức cũng bấy nhày.

Ở phần này, ta sẽ đi giải đáp một số câu hỏi như sau:

  • Tạo 2 GUI chạy song song thì làm sao?
  • Kết nối 2 GUI với nhau thì làm ntn?
  • Làm sao để GUI này thực thi không làm ảnh hưởng đến GUI kia?
Tất cả sẽ được giải đáp trong bài này.

Hướng dẫn
Lời đầu tiên, những gì trên phần giới thiệu là suy nghĩ của riêng mình. Nếu mình có lỡ "suy bụng ta ra bụng người" thì các bạn thông cảm cho mình. Vì mình cũng là vọc sĩ như các bạn thôi :)) chả hề qua một khóa học tập nào hết. Tự mình tập cho mình thôi.

Đầu tiên, để lấy dữ liệu hành động của GUI, ta cần đặt hàm GUIGetMsg trong phần while của GUI. Phần này mình cũng không rõ vì chỉ mới tìm hiểu dạo gần đây. Ta có cấu trúc của hàm GUIGetMsg như sau:
GUIGetMsg ( [advanced = 0] )

Hệ thống sẽ trả về giá trị như sau:
$GUI_EVENT_SINGLE (0) = (mặc định) Trả về một giá trị sự kiện duy nhất thôi.
$GUI_EVENT_ARRAY (1) = Trả về một mảng chứa các sự kiện và thông tin mở rộng.

Lưu ý: phải khai biến include GUIConstantsEx.au3 nhé.

Thông thường, để sử dụng nhiều hơn 1 GUI thì ta sẽ sử dụng giá trị advenced = 1, trả về nhiều giá trị.
Các sự kiện được trả về là các controlID, ví dụ như $GUI_EVENT_CLOSE: là khi bạn bấm nút tắt (X)

Các ID của sự kiện:
$GUI_EVENT_NONE (0): Không có sự kiện gì xảy ra
$GUI_EVENT_CLOSE: Nút tắt/thoát (ấn nút X tắt đấy)
$GUI_EVENT_MINIMIZE: Nút thu xuống.
$GUI_EVENT_RESTORE: Nút khôi phục.
$GUI_EVENT_MAXIMIZE: Nút phóng to tối đa.
$GUI_EVENT_MOUSEMOVE: Con trỏ chuột đã di chuyển.
$GUI_EVENT_PRIMARYDOWN: Nút chuột chính được nhấn.
$GUI_EVENT_PRIMARYUP: Nút chuột chính đã được phát hành.
$GUI_EVENT_SECONDARYDOWN: Nút chuột thứ hai được nhấn.
$GUI_EVENT_SECONDARYUP: Nút chuột thứ hai được phát hành.
$GUI_EVENT_RESIZED: Hộp thoại đã được thu nhỏ.
$GUI_EVENT_DROPPED: Kết thúc một Drag & Drop hành động @GUI_DragId, @GUI_DragFile và @GUI_DropId sẽ được sử dụng để lấy ID / tập tin tương ứng với liên quan đến kiểm soát.

Về multi GUI thì ta chỉ quan tâm đến $GUI_EVENT_CLOSE thôi.

Tiếp theo, ta sẽ bắt đầu đi vào ví dụ: Đầu tiên mình có một GUI như thế này
Local $hGUI1 = GUICreate("Example GUI1")
Local $idButton1 = GUICtrlCreateButton("Button1", 10, 10, 80, 22)
GUISetState(@SW_SHOW, $hGUI1)
Local $hGUI2 = GUICreate("Example GUI2", 300, 300)
Local $idButton2 = GUICtrlCreateButton("Button2", 10, 10, 80, 22)
GUISetState(@SW_SHOW, $hGUI2)


Vấn đề đặt ra, làm sao khi ấn Button1 (trên GUI 1) thì GUI 2 sẽ hiện ra và khi ấn Button2 (trên GUI 2) thì GUI 2 sẽ tắt.

Ta có phần While như sau:
While 1
 $aMsg = GUIGetMsg($GUI_EVENT_ARRAY) :~ Chúng ta có 2 GUI nên phải sử dụng ARRAY
 Switch $aMsg[1]
  Case $hGUI1 ;~ GUI 1
   Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE ;~ Bấm phát tắt code luôn (tại nó là GUI 1) (*)
     Exit
    Case $idButton1 ;~ Button1 đây, bấm cái GUI 2 hiện lên

     GUISetState(@SW_SHOW, $hGUI2) ;~ @SW_SHOW là hiện lên, $hGUI2 là GUI 2
   EndSwitch


  Case $hGUI2 ;~ GUI 2
   Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE ;~ Nếu bấm nút (X) thoát thì GUI 2 sẽ tắt, GUI 1 còn nguyên (**), phần này khác so với (*) nhé
     GUISetState(@SW_HIDE, $hGUI2) ;~ @SW_HIDE là ẩn đi
    Case $idButton2 ;~ Nếu button2 được bấm thì GUI 2 sẽ tắt đi giống như (**)
     GUISetState(@SW_HIDE, $hGUI2)
   EndSwitch ;~ Có Switch thì phải có EndSwitch nhé.
 EndSwitch
WEnd


Bài viết đến đây là xong. Ví dụ trên mình lấy từ Example 2 của GUIGetMsg trong file help đấy nhé.

Mã nguồn
Xem full code: http://menly.ml/view/0f022c28

Share this

Related Posts

Previous
Next Post »