MrVietA2 Posted March 31, 2013 Share Posted March 31, 2013 (edited) This is my code :expandcollapse popup#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 ;==>CleanupMy 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 April 1, 2013 by MrVietA2 Link to comment Share on other sites More sharing options...
FireFox Posted March 31, 2013 Share Posted March 31, 2013 Hi,between 2 SubitemWhat do you mean ? It works for me, even your code is a little bit bugged.Br, FireFox. MrVietA2 1 Link to comment Share on other sites More sharing options...
MrVietA2 Posted March 31, 2013 Author Share Posted March 31, 2013 (edited) 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 March 31, 2013 by MrVietA2 Link to comment Share on other sites More sharing options...
FireFox Posted March 31, 2013 Share Posted March 31, 2013 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. MrVietA2 1 Link to comment Share on other sites More sharing options...
MrVietA2 Posted April 1, 2013 Author Share Posted April 1, 2013 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.... Link to comment Share on other sites More sharing options...
water Posted April 1, 2013 Share Posted April 1, 2013 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 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
MrVietA2 Posted April 1, 2013 Author Share Posted April 1, 2013 expandcollapse popup#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 Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted April 1, 2013 Moderators Share Posted April 1, 2013 (edited) 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: expandcollapse popup#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_ListviewJust doubleclick in the ListView to enter "edit" mode. M23 Edited April 1, 2013 by Melba23 Updated link to the newer Beta MrVietA2 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
MrVietA2 Posted April 2, 2013 Author Share Posted April 2, 2013 Thanks Melba23, it works for me Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now