Vậy nên mình quyết tâm mang em nó vào cái notepad của mình làm xong thì cũng thấy khá hay nên viết lên đây để chia sẻ cho các bạn.
Trước hết là mình sẽ nói với các bạn về thuật toán cũng như cách tạo ra em này:
Bạn cần phải tạo ra đồng thời 2 Edit box với kích thước bằng nhau ở vị trí cạnh nhau. Trong đó Edit1 để hiển thị dữ liệu và Edit2 sẽ là thanh Line Number Bar. Trong Tap Style của Koda bạn chỉ chọn các thuộc tính là
$ES_AUTOVSCROLL, $ES_READONLY, $ES_CENTER
thôi bỏ chọn WS_HSCROLL, WS_VSCROLL
nhé!Cơ bản là giao diện nó như sau:
Thuật toán để làm việc với cái thằng này như sau:Thứ nhất: Bạn phải xác định được số dòng của Edit1 thông qua hàm _GUICtrlEdit_GetLineCount Sau đó bạn set data cho Edit2 từ 1...đến số dòng của trong Edit1. Bạn cần phải bắt và xử lý trường hợp người dùng xóa bớt dòng trong Edit1 khi đó bạn lại cập nhật lại data của Edit2 cũng từ 1.. đến số dòng trong Edit1 nhé!
Thứ hai: Bạn phải đồng bộ dữ liệu hiển thị gữa Line Number Bar với Edit1 Vd: Edit1 đang bắt đầu ở dòng thứ 10 thì Line Number Bar (Edit2) của bạn cũng phải bắt đầu từ số 10 nhé! Việc này được thực hiện qua hàm _GUICtrlEdit_GetFirstVisibleLine để kiểm tra hàng đầu tiên và sau đó là hàm _GUICtrlEdit_LineScroll để Scroll cho đến đúng vị trí đầu tiên nhé!
Bonus thêm ngoài ra các bạn có thể thêm Status Bar để lấy vị trí con trỏ cho trông Pro hơn nhé!
Để lấy vị trí con trỏ chuột bạn sử dụng hàm ControlCommand với 2 comand là GetCurrentLine và GetCurrentCol. Sau đó set dữ liệu nhận được vào Status Bar nhé!
Cơ bản là như vậy sau đây mình sẽ demo cho các bạn chương trình của mình. Mã nguồn mình tham khảo của bác Melba23 tuy nhiên đã sửa vài thành phần để cập nhật dữ liệu nhanh hơn :))
#include <guiconstantsex .au3=""> #include <windowsconstants .au3=""> #Include <guiedit .au3=""> #Include <misc .au3=""> Global $g_iMainLineCount = 0 ; Keep a global count so we can check if it has changed $hGUI = GUICreate("Form1", 200, 200, Default, Default, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_SYSMENU, $WS_CAPTION, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_POPUP, $WS_POPUPWINDOW, $WS_GROUP, $WS_TABSTOP, $WS_BORDER, $WS_CLIPSIBLINGS)) $cEdit_Num = GUICtrlCreateEdit("", 10, 10, 30, 163, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_CENTER), 0) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlSetData($cEdit_Num, "1") GUICtrlSetColor(-1, 0xFF0000) GUICtrlSetBkColor($cEdit_Num, 0xC0DCC0) GUICtrlSetResizing($cEdit_Num, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH) $cEdit_Main = GUICtrlCreateEdit("", 40, 10, 150, 180, -1, 0) GUICtrlSetResizing($cEdit_Main, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM) $cLabel = GUICtrlCreateLabel("", 10, 173, 30, 17) GUICtrlSetBkColor($cLabel, 0xC0DCC0) GUICtrlSetResizing($cLabel, $GUI_DOCKSTATEBAR + $GUI_DOCKLEFT + $GUI_DOCKWIDTH) ; $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH) GUISetState(@SW_SHOW) AdlibRegister("_LineNum", 111) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func _LineNum() ; line numbering Local $iCount = _GUICtrlEdit_GetLineCount ($cEdit_Main) ;Check if the number of lines has changed in $cEdit_Main ;since this function was last called If $iCount <> $g_iMainLineCount Then ;save the new count to the global variable $g_iMainLineCount = $iCount Local $iNumCount = _GUICtrlEdit_GetLineCount ($cEdit_Num) If $g_iMainLineCount > $iNumCount Then For $i = $iNumCount + 1 To $g_iMainLineCount _GUICtrlEdit_AppendText ($cEdit_Num, @CRLF & $i) Next ElseIf $g_iMainLineCount < $iNumCount Then $text = GUICtrlRead($cEdit_Num) For $i = $iNumCount To $g_iMainLineCount + 1 Step -1 $text = StringReplace($text,@CRLF & $i,"") Next GUICtrlSetData($cEdit_Num, $text) EndIf EndIf Local $iFirstVisMain = _GUICtrlEdit_GetFirstVisibleLine ($cEdit_Main) Local $iFirstVisNum = _GUICtrlEdit_GetFirstVisibleLine ($cEdit_Num) If $iFirstVisMain <> $iFirstVisNum Then _GUICtrlEdit_LineScroll($cEdit_Num, 0, $iFirstVisMain - $iFirstVisNum) EndIf EndFunc Func _number_fucus() Local $vt[2][1] $vt[1][1]= ControlCommand($hGUI,"",$cEdit_Main,"GetCurrentLine","") $vt[2][1]= ControlCommand($hGUI,"",$cEdit_Main,"GetCurrentCol","") EndFunc
Seo Tag: Line Number Bar AutoIT
Pass giải nén(nếu có) :http://nothing1010.blogspot.comLưu ý với các bạn là blog của mình sử dụng WinRar 5 để nén nên các bạn phải dùng WinRar5 để giải nén nhé! Nếu bạn nào chưa có thì có thể vào ĐÂY để tải và cài đặt bản mới nhất nhé!
No comments:
Write nhận xét