Saturday, July 23, 2016

[AutoIT] Thêm show line number bar cho Edit box

 


Chả là hôm nay mình đang nghịch làm cái Notepad thay cho cái Notepad cũ rích của windows bằng AutoIT sao cho nó giống cái Notepad plus plus thì thấy cái thằng này nó có cái line number bar phía bên trái khá tiện lợi nó giúp mình biết được vị trí dòng đang làm việc ....


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.com
 Lư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é!
Kiếm tiền online

No comments:
Write nhận xét