Advertisement
emga9xkc

Hướng dẫn Tạo GUI bằng WinAPI (library win32) Autoit

Feb 13th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 4.38 KB | None | 0 0
  1. #include <WinAPIRes.au3>
  2. #include <WinAPISys.au3>
  3. #include <WindowsConstants.au3>
  4.  
  5. ; http://msdn.microsoft.com
  6. Local Const $sClass = 'MyCustomClassName' ; Tên class name cho window
  7. Local Const $sName = 'Test Win32 GUI' ; Tên tiêu đề window
  8.  
  9. Global $bExit = False
  10.  
  11. ; Lấy module handle ~ 0
  12. Local $hInstance = _WinAPI_GetModuleHandle(0)
  13.  
  14. ; Load cursor cho window
  15. Local $hCursor = _WinAPI_LoadCursor(0, 32512) ; IDC_ARROW = standard cursor (arrow)
  16.  
  17. ; Tạo icon cho window
  18. Local $tIcons = DllStructCreate('ptr;ptr')
  19. _WinAPI_ExtractIconEx(@SystemDir & '\shell32.dll', 15, DllStructGetPtr($tIcons, 1), DllStructGetPtr($tIcons, 2), 1)
  20. Local $hIcon = DllStructGetData($tIcons, 1)
  21. Local $hIconSm = DllStructGetData($tIcons, 2)
  22.  
  23. ; Tạo DLL Callback; return: LRESULT, param: HWND, UINT, WPARAM, LPARAM
  24. Local $hProc = DllCallbackRegister('WINPROC', 'lresult', 'hwnd;uint;wparam;lparam')
  25.  
  26. ; Tạo DLL cấu trúc dữ liệu cho window class, xem trên MSDN dể hiểu rõ hơn
  27. Local $tWCEX = DllStructCreate($tagWNDCLASSEX & ';wchar szClassName[' & (StringLen($sClass) + 1) & ']')
  28. DllStructSetData($tWCEX, 'Size', DllStructGetPtr($tWCEX, 'szClassName') - DllStructGetPtr($tWCEX))
  29. DllStructSetData($tWCEX, 'Style', BitOR(0x0001,0x0002, 0x20000)) ; style cho window, 0x20000 kèm thêm shadow của class #32768 (class của popupmenu)
  30. DllStructSetData($tWCEX, 'hWndProc', DllCallbackGetPtr($hProc))
  31. DllStructSetData($tWCEX, 'ClsExtra', 0)
  32. DllStructSetData($tWCEX, 'WndExtra', 0)
  33. DllStructSetData($tWCEX, 'hInstance', $hInstance)
  34. DllStructSetData($tWCEX, 'hIcon', $hIcon) ; icon
  35. DllStructSetData($tWCEX, 'hCursor', $hCursor) ; cursor
  36. DllStructSetData($tWCEX, 'hBackground', _WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($COLOR_3DFACE)))
  37. DllStructSetData($tWCEX, 'MenuName', 0)
  38. DllStructSetData($tWCEX, 'ClassName', DllStructGetPtr($tWCEX, 'szClassName'))
  39. DllStructSetData($tWCEX, 'hIconSm', $hIconSm)
  40. DllStructSetData($tWCEX, 'szClassName', $sClass) ; class namme
  41.  
  42. ; đăng ký class cho window
  43. _WinAPI_RegisterClassEx($tWCEX)
  44.  
  45. ; tạo window mới với class vừa tạo
  46. Global $hGUI = _WinAPI_CreateWindowEx(0, $sClass, $sName, BitOR($WS_CAPTION, $WS_POPUPWINDOW, $WS_VISIBLE, 0x00CF0000), (@DesktopWidth - 400) / 2, (@DesktopHeight - 400) / 2, 400, 400, 0)
  47.  
  48.  
  49. ; Tạo button từ class "button" có sẵn trong windows-ms
  50. Global $hButton1 = _WinAPI_CreateWindowEx(0, "Button", "Button 1", BitOR($WS_CHILD, $WS_VISIBLE), 40, 40, 100, 35, $hGUI)
  51. Global $hButton2 = _WinAPI_CreateWindowEx(0, "Button", "Button 2", BitOR($WS_CHILD, $WS_VISIBLE), 40, 80, 100, 35, $hGUI)
  52.  
  53.  
  54.  
  55. While 1
  56.         Sleep(10) ; Nhớ đặt sleep hoặc bất kỳ thứ gì trong While...Wend để tránh lỗi ngốn CPU
  57.         If $bExit Then
  58.                 ExitLoop
  59.         EndIf
  60. WEnd
  61.  
  62. ; Xóa class vừa đăng ký, release icon/cursor..., không có cũng không sao
  63. _WinAPI_UnregisterClass($sClass, $hInstance)
  64. _WinAPI_DestroyCursor($hCursor)
  65. _WinAPI_DestroyIcon($hIcon)
  66. _WinAPI_DestroyIcon($hIconSm)
  67.  
  68. DllCallbackFree($hProc)
  69.  
  70. ; Callback của window (WINPROC), trong hàm này sẽ xử lý song song với thread của AutoIt
  71. ; Hàm này sẽ không bị dừng khi dùng vòng lặp (while, do, for...), có thể tương tác bất kỳ lúc nào
  72. ; Nếu dùng sleep thì toàn bộ chương trình sẽ dừng lại
  73. Func WINPROC($hWnd, $iMsg, $wParam, $lParam)
  74.  
  75.         Switch $iMsg ; đọc message của window gửi tới và xử lý
  76.                 Case $WM_CLOSE ; khi nhấn close (nút X) thì procedure nhận
  77.  
  78.                         $bExit = True ; set true để dòng trên While thoát chương trình
  79.                 Case $WM_COMMAND ; lệnh command khi tương tác với window
  80.  
  81.                         Switch $lParam ; lparam sẽ trả về handle của control đó
  82.                                 Case $hButton1
  83.                                         MsgBox(0, "", "You clicked Button 1")
  84.                                 Case $hButton2
  85.                                         MsgBox(0, "", "You clicked Button 2")
  86.                         ; Bạn có thể nhấn liên tục vào các Button mà không bị dừng lại, mặc dù các thông báo liên tục xuất ra
  87.  
  88.  
  89.                         EndSwitch
  90.         EndSwitch
  91.  
  92.         Return _WinAPI_DefWindowProcW($hWnd, $iMsg, $wParam, $lParam) ; phải bắt buộc define cho window để không bị lỗi
  93. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement