AutoIT tut 22 : GuiCtrlCreate
GUICtrlCreateList
Hàm này sẽ giúp bạn tạo ra một cái danh sách để chứa thông tin. Danh sách là một dạng dữ liệu rất hay gặp trong đời thường và trên máy tính (ở các chương trình nghe nhạc và quản lý). Tuy nhiên, ở đây AutoIt chỉ hỗ trợ bạn tạo ra một danh sách với các tính năng đơn giản, thông dụng. Danh sách này chỉ có một cột nhưng lại có nhiều dòng. Nếu bạn cần một danh sách có nhiều cột và nhiều dòng thì hãy dùng ListView , ở đây tôi không đề cập đến phần này. Cú pháp cho bạn tạo một Listbox như sau :
GUICtrlCreateList ( “text”, left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Text | Văn bản sẽ hiển thị trong List box |
left | Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
Top | Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
width | [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó |
height | [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó. |
style | [Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix. default ( -1) : $LBS_SORT, $WS_BORDER, $WS_VSCROLL style bắt buộc : $WS_TABSTOP, $LBS_NOTIFY |
exStyle | [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table. |
Giá trị trả về
Th. Công : | Trả về ID của listbox vừa tạo |
Hỏng : | Trả về 0 |
Chú ý
Ø Để đọc các giá trị của listbox , xem hàm GUICtrlRead
Ø Để thiết lập hoặc thay đổi thông tin , xem hàm GUICtrlSet….
Ø Nhiều mục-nhập (entry) khác nhau trong danh sách có thể được chọn , được thiết lập với GUICtrlSetData
Ø Để giới hạn mức cuộn (srolling) theo chiều ngang , dùng hàm GUICtrlSetLimit
Ø Để kết hợp style mặc định với các style khác , gọi BitOr($GUI_SS_DEFAULT_LIST, newstyle,…).
Ø Để sử dụng được các giá trị nêu trên , cần gọi thư viện : #include <ListBoxConstants.au3>
Ø Đưa về kích thước mặc định (size và vị trí) : $GUI_DOCKAUTO
Ví dụ
#include <GUIConstantsEx.au3>
Opt(‘MustDeclareVars’, 1)
Example()
Func Example()
Local $MESSAGE = “The following buttons have been clicked”
Local $add, $clear, $mylist, $close, $msg
GUICreate(“My GUI list”) ; will create a dialog box that when displayed is centered
$add = GUICtrlCreateButton(“Add”, 64, 32, 75, 25)
$clear = GUICtrlCreateButton(“Clear”, 64, 72, 75, 25)
$mylist = GUICtrlCreateList(“buttons that have been clicked”, 176, 32, 121, 97)
GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
GUICtrlSetData(-1, $MESSAGE)
$close = GUICtrlCreateButton(“my closing button”, 64, 160, 175, 25)
GUISetState()
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $add
GUICtrlSetData($mylist, “You clicked button No1|”)
Case $msg = $clear
GUICtrlSetData($mylist, “”)
Case $msg = $close
MsgBox(0, “”, “the closing button has been clicked”, 2)
Exit
EndSelect
WEnd
EndFunc ;==>Example
GUICtrlCreateListView
ListView cũng chính là một danh sách (Listbox) nhưng nó có nhiều dòng và nhiều cột , tạo thành một ma trận. Listview mà bạn thường thấy là trong Windows Explorer , khi bạn duyệt file với chế độ View là Detail.
GUICtrlCreateListView ( “text”, left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
text | Văn bản này sẽ là tiêu đề của các cột trong listview. Mỗi tiêu đề sẽ được ngăn cách với ký tự được chỉ định trong Opt(“GUIDataSeparatorChar”). |
left | Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
Top | Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
width | [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó |
height | [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó. |
style | [tùy chọn] định nghĩa style cho control. Xem GUI Control Styles Appendix. default (-1) : $LVS_SHOWSELALWAYS, $LVS_SINGLESEL style bắt buộc : $LVS_REPORT |
exStyle | [tùy chọn] định nghĩa style mở rộng cho control. Xem Extended Style Table hoặc ListView Extended Style Table. |
Giá trị trả về
Th. Công : | Trả về ID của listview vừa được tạo |
Hỏng : | Trả về 0 |
Chú ý
Ø Để thêm các mục vào Listview , sử dụng hàm GUICtrlCreateListViewItem
Ø ListView sẽ xuất hiện mặc định như trong windows explorer với view là Detail (LVS_REPORT là bắt buộc).
Bạn có thể khởi tạo kích thước cho một cột bằng cách nối thêm các khoảng trắng vào tiêu đề của cột. Cột có thể được mở rộng theo chiều dài của mục-(item)-được-thêm-vào bởi GUICtrlCreateListViewItem. Kích thước của một cột sẽ lên đến 25 ký tự. Nhưng sẽ không có một sự resize được diễn ra khi bạn cập nhật nội dung ListView bằng GuiCtrlSetData.
Ø Để tạo một ListView với icon, icon nhỏ hoặc chỉ là một kiểu List , sau khi tạo bạn gọi hàm GUICtrlSetStyle với các style : $LVS_ICON, $LVS_SMALLICON hoặc $LVS_LIST.
Ø Chức năng sắp xếp các mục trong ListView bằng cách nhấp vào tiêu đề của cột (như trong Explorer) thì không có tác dụng.
Ø Khi bạn chọn một mục trong ListView, bạn muốn toàn bộ dòng đó được phát sáng thay vì chỉ có ở một cột thì hãy gọi style mở rộng $LVS_EX_FULLROWSELECT.
Ø Để kết hợp style mặc định với style khác , bạn gọi BitOr($GUI_SS_DEFAULT_LISTVIEW, newstyle,…).
Ø Thư viện cần thiết cho các tham số nêu ở trên là : #include <ListViewConstants.au3>
Ø $GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng với Listview để làm cho màu nền giữa các dòng có thể xen kẽ nhau.
– Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListView
– Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
GUISetState()
GUICtrlSetData($item2, "ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
GUICtrlCreateListViewItem
Tạo ra một mục (item) mới để thêm vào trong ListView.
GUICtrlCreateListViewItem ( “text”, listviewID )
Các tham số
Text | Văn bản của các mục (item) phụ, mỗi mục được ngăn cách với Opt(“GUIDataSeparatorChar”). |
listviewID | Định danh (ID) của control ListView mà bạn muốn thêm item vào |
Giá trị trả về
Th. Công : | Định danh (ID) của mục vừa được tạo |
Failure: | Trả về 0 |
Chú ý
Ø Hàm này tạo ra những mục (item) Listview đặc biệt, chúng có thể được chọn, có tính năng như những control bình thường và có thể được thiết lập với GUICtrlSetData.
Ø Các item này có thể được xóa bỏ như các control khác khi gọi hàm GUICtrlDelete
Ø Những mục trong Listview có thể được kéo thả vào trong một control Edit hay Input , khi được thiết lập trạng thái (state) $GUI_DROPACCEPTED.
Ø Xem hàm GUICtrlCreateListView về việc resize lại kích thước của các cột.
Ø $GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng với Listview để làm cho màu nền giữa các dòng có thể xen kẽ nhau.
– Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListView
– Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("............item1|col12|col13", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
GUISetState()
GUICtrlSetData($item2, "|ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
GUICtrlCreatePic
Hàm này sẽ tạo ra một control cho phép nạp và hiển thị hình ảnh (picture) trên GUI.
GUICtrlCreatePic ( filename, left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Filename | Đường dẫn và tên đầy đủ file ảnh cần load. Hỗ trợ ảnh BMP, JPG và GIF (không có hình động) |
left | Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
Top | Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode. |
width | [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó |
height | [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó. |
Style | [Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix. default (-1) : $SS_NOTIFY style bắt buộc : $SS_BITMAP |
exStyle | [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table. |
Giá trị trả về
Th. Công : | Trả về ID của control picture vừa được tạo |
Hỏng : | Trả về 0 nếu ảnh không tạo được ảnh |
Chú ý
Ø Để thiết lập hoặc thay đổi thông tin picture, xem hàm GUICtrlSet….
Ø Để cập nhật ảnh sau khi hộp thoại đã được hiển thị , sử dụng hàm GUICtrlSetImage
Ø Nếu bạn muốn ảnh hiển thị với kích thước gốc của nó , gán width = heigh = 0
Ø Nếu bạn muốn có một ảnh trong suốt , bạn cần tạo GUI với style mở rộng $WS_LAYERED. Điểm ảnh left-top (góc trái trên) sẽ được dùng làm màu trong suốt. Khi có nhiều ảnh được tạo , thì ảnh cuối cùng được định nghĩa màu trong suốt. Xem example 2.
Ø .Để kết hợp style mặc định với style khác , sử dụng BitOr($GUI_SS_DEFAULT_PIC, newstyle,…).
Ø Để sử dụng được các giá trị nêu trên , gọi thư viện #include <StaticConstants.au3>
Ø Đưa về kích thước mặc định : $GUI_DOCKSIZE.
Ø Nếu một ảnh được thiết lập làm ảnh trong suốt , các control khác sẽ bị phủ lấp , điều quan trọng là phải vô hiệu control pic và tạo nó sau khi bạn đã tạo các control khác : GUICtrlSetState(-1, $GUI_DISABLE). Chỉ điều này thôi thì chưa đủ cho control Tab và ListView vì chúng sẽ hoạt động hơi khác thường. Trong trường hợp này bạn cần tạo ảnh với style $WS_CLIPSIBLINGS , GuiCtrlSetState(-1,$GUI_ONTOP) là cần thiết cho control Tab và ListView.
Ø Style mở rộng $GUI_WS_EX_PARENTDRAG cho phép bạn nắm và kéo những cửa sổ con không có thanh tiêu đề.
Ø Nền thì luôn được làm cho trong suốt. GUICtrlSetBkColor( ) thì không có tác dụng đối với control picture.
Ø PNG có thể được dùng với GDI+. Xem example 3.
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Global $gui, $guiPos, $pic, $picPos
Example1()
Example2()
;-----example 1 ----
Func Example1()
Local $n, $msg
GUICreate("My GUI picture", 350, 300, -1, -1, $WS_SIZEBOX + $WS_SYSMENU) ; will create a dialog box that when displayed is centered
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic(@SystemDir & "\oobe\images\mslogo.jpg", 50, 50, 200, 50)
GUISetState()
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
;~GUISetState ()
; resize the control
$n = GUICtrlSetPos($n, 50, 50, 200, 100)
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example1
;-----example 2
Func Example2()
Local $msg
$gui = GUICreate("test transparentpic", 200, 100,-1 )
$pic = GUICreate("", 68, 71, 10, 10, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
GUICtrlCreatePic(@SystemDir & "\oobe\images\merlin.gif", 0, 0, 0, 0,-1,$GUI_WS_EX_PARENTDRAG )
GUISetState(@SW_SHOW, $gui)
GUISetState(@SW_SHOW, $pic)
HotKeySet("{ESC}", "main")
HotKeySet("{LEFT}", "left")
HotKeySet("{RIGHT}", "right")
HotKeySet("{DOWN}", "down")
HotKeySet("{UP}", "up")
$picPos = WinGetPos($pic)
$guiPos = WinGetPos($gui)
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example2
Func main()
$guiPos = WinGetPos($gui)
WinMove($gui, "", $guiPos[0] + 10, $guiPos[1] + 10)
EndFunc ;==>main
Func left()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0] - 10, $picPos[1])
EndFunc ;==>left
Func right()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0] + 10, $picPos[1])
EndFunc ;==>right
Func down()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0], $picPos[1] + 10)
EndFunc ;==>down
Func up()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0], $picPos[1] - 10)
EndFunc ;==>up
;-----example 3 PNG work araund by Zedna
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPI.au3>
Global $hGUI, $hImage, $hGraphic, $hImage1
; Create GUI
$hGUI = GUICreate("Show PNG", 350, 301)
; Load PNG image
_GDIPlus_StartUp()
$hImage = _GDIPlus_ImageLoadFromFile("E:\WINDOWS\system32\oobe\images\thanks8.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetState()
; Loop until user exits
do
untilGUIGetMsg() = $GUI_EVENT_CLOSE
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
; Draw PNG image
Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
Return $GUI_RUNDEFMSG
EndFunc