Jump to content
Sign in to follow this  
MrVietA2

List view error

Recommended Posts

MrVietA2

This is my code :

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <EditConstants.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
#RequireAdmin
#NoTrayIcon

Global $hGui, $hListView, $hEdit, $hEdit1
Global $hDC, $hBrush, $Item = -1, $SubItem = 0, $iSubItemText, $tItem, $tSubitem, $tiSubitemtext, $currentcol
Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)

_GUI()

Func _GUI()
    Global $hGui = GUICreate("THỐNG KÊ CẤP PHÁT", @DesktopWidth - 380, @DesktopHeight - 250, -1, -1)
    Global $FileMenu = GUICtrlCreateMenu("&File")
    Global $mSave = GUICtrlCreateMenuItem("Lưu và xuất thành Excel", $FileMenu)
    Global $mExit = GUICtrlCreateMenuItem("Exit", $FileMenu)
    Global $Option = GUICtrlCreateMenu("&Options")
    Global $mConfig = GUICtrlCreateMenuItem("Tùy chỉnh", $Option)
    Global $Start = GUICtrlCreateButton("BẮT ĐẦU", 88, 400, 121, 49)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Global $Export = GUICtrlCreateButton("XUẤT EXCEL", 408, 400, 121, 49)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Global $Exit = GUICtrlCreateButton("KẾT THÚC", 720, 400, 121, 49)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Create_Listview()
    GUISetState(@SW_SHOW)

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    OnAutoItExitRegister("Cleanup")
    Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

    While 1
        $Msg = GUIGetMsg()
        Switch $Msg
            Case $GUI_EVENT_CLOSE
                Exit
;~           Case $mConfig
;~               _OptionGUI()
        EndSwitch
    WEnd
EndFunc   ;==>_GUI

Func Create_Listview()
    $hListView = _GUICtrlListView_Create($hGui, "", 5, 5, @DesktopWidth - 400, @DesktopHeight - 400, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

    _GUICtrlListView_AddColumn($hListView, "Họ và tên", 175, -1)
    _GUICtrlListView_AddColumn($hListView, "Ngày làm việc", 175, -1)
    _GUICtrlListView_AddColumn($hListView, "", 175, -1)
    _GUICtrlListView_AddColumn($hListView, "", 175, -1)

    For $i = 1 To 20
        _GUICtrlListView_AddItem($hListView, "")
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 1)
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 2)
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 3)
    Next

EndFunc   ;==>Create_Listview

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iCode, $col_width, $cInfo, $iIDFrom, $tInfo, $iLen, $aRect

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $LVN_COLUMNCLICK ; A column was clicked
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    $currentcol = DllStructGetData($tInfo, "SubItem")
                    $cInfo = _GUICtrlListView_GetColumn($hListView, $currentcol)
                    GUICtrlSetData($hEdit1, $cInfo[5])
                Case $NM_DBLCLK

                    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
                    If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
                        $Item = $aHit[0]
                        $SubItem = $aHit[1]
                        $iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
                        $iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
                        If $iLen = 0 Then
                            $iLen = 20
                        EndIf
                        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
                        $hEdit = _GUICtrlEdit_Create($hGui, $iSubItemText, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $Style)
                        _GUICtrlEdit_SetSel($hEdit, 0, -1)
                        _WinAPI_SetFocus($hEdit)
                        $hDC = _WinAPI_GetWindowDC($hEdit)
                        $hBrush = _WinAPI_CreateSolidBrush(0)
                        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $hBrush)
                    ElseIf ($aHit[0] <> -1) And ($aHit[1] = 0) Then
                        $Item = $aHit[0]
                        $SubItem = $aHit[1]
                        $iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item)
                        $iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
                        $aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
                        $hEdit = _GUICtrlEdit_Create($hGui, $iSubItemText, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $Style)
                        _GUICtrlEdit_SetSel($hEdit, 0, -1)
                        _WinAPI_SetFocus($hEdit)
                        $hDC = _WinAPI_GetWindowDC($hEdit)
                        $hBrush = _WinAPI_CreateSolidBrush(0)
                        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $hBrush)
                    EndIf
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
    Local $stRect = DllStructCreate("int;int;int;int")

    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
    DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc   ;==>FrameRect

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iCode = BitShift($wParam, 16)

    Switch $lParam
        Case $hEdit
            Switch $iCode
                Case $EN_KILLFOCUS
                    SetText()
                    $Item = -1
                    $SubItem = 0
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func EvaluateKey($keycode)
    Local $iLen, $aRect
    Sleep(10)

    If $keycode = 13 Then
        SetText()
        $Item = -1
        $SubItem = 0
    ElseIf $keycode = 38 Then ;up arrow
        If $Item <> -1 Then
            $tItem = $Item
            $tSubitem = $SubItem
            $tiSubitemtext = $iSubItemText
        EndIf
        SetText()
        If $tItem > 0 Then
            $tItem -= 1
        Else
            $tItem = 19
        EndIf
        $tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
        $iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
        $hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
        _GUICtrlEdit_SetSel($hEdit, 0, -1)
        _WinAPI_SetFocus($hEdit)
        $hDC = _WinAPI_GetWindowDC($hEdit)
        $hBrush = _WinAPI_CreateSolidBrush(0)
        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
    ElseIf $keycode = 40 Then ;down arrow
        If $Item <> -1 Then
            $tItem = $Item
            $tSubitem = $SubItem
            $tiSubitemtext = $iSubItemText
        EndIf
        SetText()
        If $tItem < 19 Then
            $tItem += 1
        Else
            $tItem = 0
        EndIf
        $tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
        $iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
        $hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
        _GUICtrlEdit_SetSel($hEdit, 0, -1)
        _WinAPI_SetFocus($hEdit)
        $hDC = _WinAPI_GetWindowDC($hEdit)
        $hBrush = _WinAPI_CreateSolidBrush(0)
        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
    ElseIf $keycode = 37 Then ;left arrow
        If $Item <> -1 Then
            $tItem = $Item
            $tSubitem = $SubItem
            $tiSubitemtext = $iSubItemText
        EndIf
        SetText()
        If $tSubitem > 0 Then
            $tSubitem -= 1
        Else
            $tSubitem = _GUICtrlListView_GetColumnCount($hListView) - 1
        EndIf
        $tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
        $iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
        $hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
        _GUICtrlEdit_SetSel($hEdit, 0, -1)
        _WinAPI_SetFocus($hEdit)
        $hDC = _WinAPI_GetWindowDC($hEdit)
        $hBrush = _WinAPI_CreateSolidBrush(0)
        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
    ElseIf $keycode = 39 Then ;right arrow
        If $Item <> -1 Then
            $tItem = $Item
            $tSubitem = $SubItem
            $tiSubitemtext = $iSubItemText
        EndIf
        SetText()
        If $tSubitem < _GUICtrlListView_GetColumnCount($hListView) - 1 Then
            $tSubitem += 1
        Else
            $tSubitem = 0
        EndIf
        $tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
        $iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
        $hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
        _GUICtrlEdit_SetSel($hEdit, 0, -1)
        _WinAPI_SetFocus($hEdit)
        $hDC = _WinAPI_GetWindowDC($hEdit)
        $hBrush = _WinAPI_CreateSolidBrush(0)
        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
    ElseIf $keycode = 9 Then ;tab
        If $Item <> -1 Then
            $tItem = $Item
            $tSubitem = $SubItem
            $tiSubitemtext = $iSubItemText
        EndIf
        SetText()
        If $tSubitem < _GUICtrlListView_GetColumnCount($hListView) - 1 Then
            $tSubitem += 1
        Else
            $tSubitem = 0
            If $tItem < 19 Then
                $tItem += 1
            Else
                $tItem = 0
            EndIf
        EndIf
        $tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
        $iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
        $aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
        $hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
        _GUICtrlEdit_SetSel($hEdit, 0, -1)
        _WinAPI_SetFocus($hEdit)
        $hDC = _WinAPI_GetWindowDC($hEdit)
        $hBrush = _WinAPI_CreateSolidBrush(0)
        FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
    EndIf
EndFunc   ;==>EvaluateKey

Func SetText()
    Local $iText = _GUICtrlEdit_GetText($hEdit)
    If $Item <> -1 Then
        _GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
    Else
        _GUICtrlListView_SetItemText($hListView, $tItem, $iText, $tSubitem)
    EndIf
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_ReleaseDC($hEdit, $hDC)
    _WinAPI_DestroyWindow($hEdit)
EndFunc   ;==>SetText

Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS

    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
        EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
    Else
        Local $flags = DllStructGetData($tKEYHOOKS, "flags")
        Switch $flags
            Case $LLKHF_ALTDOWN
;~               ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)
            Case $LLKHF_EXTENDED
;~               ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)
            Case $LLKHF_INJECTED
;~               ConsoleWrite("$LLKHF_INJECTED" & @CRLF)
            Case $LLKHF_UP
;~               ConsoleWrite("$LLKHF_UP: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & DllStructGetData($tKEYHOOKS, "vkCode") & @CRLF)
        EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
EndFunc   ;==>Cleanup

My code is error now, I can't use Tab, up arrow, down arrow, left arrow between 2 Subitem in Listview control. I try to fix this error but I can't find anything, and I think this error is come from EvaluateKey(). Please help me, I will be very grateful

Edited by MrVietA2

Share this post


Link to post
Share on other sites
FireFox

Hi,

between 2 Subitem

What do you mean ? It works for me, even your code is a little bit bugged.

Br, FireFox.

  • Like 1

 

OS : Win XP SP2 (32 bits) / Win 7 SP1 (64 bits) / Win 8 (64 bits) | Autoit version: latest stable / beta.
Hardware : Intel(R) Core(TM) i5-2400 CPU @ 3.10Ghz / 8 GiB RAM DDR3.

My UDFs : Skype UDF | TrayIconEx UDF | GUI Panel UDF | Excel XML UDF | Is_Pressed_UDF

My Projects : YouTube Multi-downloader | FTP Easy-UP | Lock'n | WinKill | AVICapture | Skype TM | Tap Maker | ShellNew | Scriptner | Const Replacer | FT_Pocket | Chrome theme maker

My Examples : Capture toolIP Camera | Crosshair | Draw Captured Region | Picture Screensaver | Jscreenfix | Drivetemp | Picture viewer

My Snippets : Basic TCP | Systray_GetIconIndex | Intercept End task | Winpcap various | Advanced HotKeySet | Transparent Edit control

 

Share this post


Link to post
Share on other sites
MrVietA2

Sorry for my bad English, I can't use tab key, up arrow, down arrow and left arrow to switch position of SubItem in Listview

Edited by MrVietA2

Share this post


Link to post
Share on other sites
FireFox

I said that it works (at least for me), you should debug your code and see where it stucks.

I also suggest you to use the HotKeySet function.

Br, FireFox.

  • Like 1

 

OS : Win XP SP2 (32 bits) / Win 7 SP1 (64 bits) / Win 8 (64 bits) | Autoit version: latest stable / beta.
Hardware : Intel(R) Core(TM) i5-2400 CPU @ 3.10Ghz / 8 GiB RAM DDR3.

My UDFs : Skype UDF | TrayIconEx UDF | GUI Panel UDF | Excel XML UDF | Is_Pressed_UDF

My Projects : YouTube Multi-downloader | FTP Easy-UP | Lock'n | WinKill | AVICapture | Skype TM | Tap Maker | ShellNew | Scriptner | Const Replacer | FT_Pocket | Chrome theme maker

My Examples : Capture toolIP Camera | Crosshair | Draw Captured Region | Picture Screensaver | Jscreenfix | Drivetemp | Picture viewer

My Snippets : Basic TCP | Systray_GetIconIndex | Intercept End task | Winpcap various | Advanced HotKeySet | Transparent Edit control

 

Share this post


Link to post
Share on other sites
MrVietA2

I edited my code. You can run and easy to use up arrow, down arrow and left arrow in my list but you can't use Tab key....

Share this post


Link to post
Share on other sites
water

Can you strip down your script to a simple reproducer script with a few lines?

I'm not going to run a script on my computer that needs admin rights.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-09-01 - Version 1.3.4.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites
MrVietA2

#include 
#include 
#include 
#include 
#include 
#include 
#NoTrayIcon

Global $hGui, $hListView, $hEdit, $hEdit1
Global $hDC, $hBrush, $Item = -1, $SubItem = 0, $iSubItemText, $tItem, $tSubitem, $tiSubitemtext, $currentcol
Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)

_GUI()

Func _GUI()
Global $hGui = GUICreate("script", @DesktopWidth - 380, @DesktopHeight - 250, -1, -1)
GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
Global $Button1 = GUICtrlCreateButton("Button 1", 408, 400, 121, 49)
GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
Global $Button2 = GUICtrlCreateButton("Button2", 720, 400, 121, 49)
GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
Create_Listview()
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
OnAutoItExitRegister("Cleanup")
Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
;~ Case $mConfig
;~ _OptionGUI()
EndSwitch
WEnd
EndFunc ;==>_GUI

Func Create_Listview()
$hListView = _GUICtrlListView_Create($hGui, "", 5, 5, @DesktopWidth - 400, @DesktopHeight - 400, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

_GUICtrlListView_AddColumn($hListView, "Column 1", 175, -1)
_GUICtrlListView_AddColumn($hListView, "Column 2", 175, -1)
_GUICtrlListView_AddColumn($hListView, "", 175, -1)
_GUICtrlListView_AddColumn($hListView, "", 175, -1)

For $i = 1 To 20
_GUICtrlListView_AddItem($hListView, "")
_GUICtrlListView_AddSubItem($hListView, $i - 1, "", 1)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "", 2)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "", 3)
Next

EndFunc ;==>Create_Listview

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $tNMHDR, $hWndFrom, $iCode, $col_width, $cInfo, $iIDFrom, $tInfo, $iLen, $aRect

$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")

Switch $hWndFrom
Case $hListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
$currentcol = DllStructGetData($tInfo, "SubItem")
$cInfo = _GUICtrlListView_GetColumn($hListView, $currentcol)
GUICtrlSetData($hEdit1, $cInfo[5])
Case $NM_DBLCLK

Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
$iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
If $iLen = 0 Then
$iLen = 20
EndIf
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
$hEdit = _GUICtrlEdit_Create($hGui, $iSubItemText, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $hBrush)
ElseIf ($aHit[0] <> -1) And ($aHit[1] = 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
$iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
$aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
$hEdit = _GUICtrlEdit_Create($hGui, $iSubItemText, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $SubItem), 17, $hBrush)
EndIf
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY

Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
Local $stRect = DllStructCreate("int;int;int;int")

DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)
DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc ;==>FrameRect

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitShift($wParam, 16)

Switch $lParam
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
SetText()
$Item = -1
$SubItem = 0
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

Func EvaluateKey($keycode)
Local $iLen, $aRect
Sleep(10)

If $keycode = 13 Then
SetText()
$Item = -1
$SubItem = 0
ElseIf $keycode = 38 Then ;up arrow
If $Item <> -1 Then
$tItem = $Item
$tSubitem = $SubItem
$tiSubitemtext = $iSubItemText
EndIf
SetText()
If $tItem > 0 Then
$tItem -= 1
Else
$tItem = 19
EndIf
$tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
$hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
ElseIf $keycode = 40 Then ;down arrow
If $Item <> -1 Then
$tItem = $Item
$tSubitem = $SubItem
$tiSubitemtext = $iSubItemText
EndIf
SetText()
If $tItem < 19 Then
$tItem += 1
Else
$tItem = 0
EndIf
$tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
$hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
ElseIf $keycode = 37 Then ;left arrow
If $Item <> -1 Then
$tItem = $Item
$tSubitem = $SubItem
$tiSubitemtext = $iSubItemText
EndIf
SetText()
If $tSubitem > 0 Then
$tSubitem -= 1
Else
$tSubitem = _GUICtrlListView_GetColumnCount($hListView) - 1
EndIf
$tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
$hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
ElseIf $keycode = 39 Then ;right arrow
If $Item <> -1 Then
$tItem = $Item
$tSubitem = $SubItem
$tiSubitemtext = $iSubItemText
EndIf
SetText()
If $tSubitem < _GUICtrlListView_GetColumnCount($hListView) - 1 Then
$tSubitem += 1
Else
$tSubitem = 0
EndIf
$tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
$hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
ElseIf $keycode = 9 Then ;tab
If $Item <> -1 Then
$tItem = $Item
$tSubitem = $SubItem
$tiSubitemtext = $iSubItemText
EndIf
SetText()
If $tSubitem < _GUICtrlListView_GetColumnCount($hListView) - 1 Then
$tSubitem += 1
Else
$tSubitem = 0
If $tItem < 19 Then
$tItem += 1
Else
$tItem = 0
EndIf
EndIf
$tiSubitemtext = _GUICtrlListView_GetItemText($hListView, $tItem, $tSubitem)
$iLen = _GUICtrlListView_GetStringWidth($hListView, $tiSubitemtext)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $tItem, $tSubitem)
$hEdit = _GUICtrlEdit_Create($hGui, $tiSubitemtext, $aRect[0] + 3, $aRect[1] + 4, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, _GUICtrlListView_GetColumnWidth($hListView, $tSubitem), 17, $hBrush)
EndIf
EndFunc ;==>EvaluateKey

Func SetText()
Local $iText = _GUICtrlEdit_GetText($hEdit)
If $Item <> -1 Then
_GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
Else
_GUICtrlListView_SetItemText($hListView, $tItem, $iText, $tSubitem)
EndIf
_WinAPI_DeleteObject($hBrush)
_WinAPI_ReleaseDC($hEdit, $hDC)
_WinAPI_DestroyWindow($hEdit)
EndFunc ;==>SetText

Func _KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS

$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
If $wParam = $WM_KEYDOWN Then
EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
Else
Local $flags = DllStructGetData($tKEYHOOKS, "flags")
Switch $flags
Case $LLKHF_ALTDOWN
;~ ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)
Case $LLKHF_EXTENDED
;~ ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)
Case $LLKHF_INJECTED
;~ ConsoleWrite("$LLKHF_INJECTED" & @CRLF)
Case $LLKHF_UP
;~ ConsoleWrite("$LLKHF_UP: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & DllStructGetData($tKEYHOOKS, "vkCode") & @CRLF)
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProc

Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_KeyProc)
EndFunc ;==>Cleanup

I think I know where this error comes from, if I created 2 button on my GUI, the Tab key couldn't use, but If I didn't move 2 button out my GUI, the Tab key could be used

Share this post


Link to post
Share on other sites
Melba23

MrVietA2,

Firstly, I suggest you create your buttons outside of the area covered by the ListView. :)

Secondly, if you want an editable ListView I suggest you look at the Beta version of my GUIListViewEx UDF that you can find here. By using it I have reduced your code to the following, which looks a lot simpler to me: ;)

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#include "GUIListViewEx_Mod.au3"

Global $hListView

_GUI()

Func _GUI()
    Global $hGui = GUICreate("script", @DesktopWidth - 380, @DesktopHeight - 250, -1, -1)
    GUISetBkColor(0xC4C4C4)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Global $Button1 = GUICtrlCreateButton("Button 1", 408, @DesktopHeight - 350, 121, 49)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Global $Button2 = GUICtrlCreateButton("Button2", 720, @DesktopHeight - 350, 121, 49)
    GUICtrlSetFont(-1, 12, 800, 0, "Times New Roman")
    Create_Listview()
    GUISetState(@SW_SHOW)

    Local $aLV_Array = _GUIListViewEx_ReadToArray($hListView)
    _GUIListViewEx_Init($hListView, $aLV_Array, 0, 0, 2)
    _GUIListViewEx_DragRegister(True, False, False)

    While 1
        $Msg = GUIGetMsg()
        Switch $Msg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch

        _GUIListViewEx_Edit()

    WEnd
EndFunc   ;==>_GUI

Func Create_Listview()
    $hListView = _GUICtrlListView_Create($hGui, "", 5, 5, @DesktopWidth - 400, @DesktopHeight - 400, $LVS_REPORT)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

    _GUICtrlListView_AddColumn($hListView, "Column 1", 175)
    _GUICtrlListView_AddColumn($hListView, "Column 2", 175)
    _GUICtrlListView_AddColumn($hListView, "", 175)
    _GUICtrlListView_AddColumn($hListView, "", 175)

    For $i = 1 To 20
        _GUICtrlListView_AddItem($hListView, "")
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 1)
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 2)
        _GUICtrlListView_AddSubItem($hListView, $i - 1, "", 3)
    Next

EndFunc   ;==>Create_Listview

Just doubleclick in the ListView to enter "edit" mode. ;)

M23

Edited by Melba23
Updated link to the newer Beta
  • Like 1

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
MrVietA2

Thanks Melba23, it works for me :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×