LarsJ Posted February 6, 2018 Author Share Posted February 6, 2018 The usual way is to extract data directly from the source. But in your code, I think you can extract data from the data cache, the $aResult array. You can also extract data in the columns to be colored from the database and save data in its own array. You can do that in the start of your program. If you have many rows in your database, it'll be a large array. Maybe take a look at the techniques used in this example. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kklee69 Posted March 21, 2018 Share Posted March 21, 2018 Can I casually ask another question? Is it possible Put Treeview into Listview like this process explorer Link to comment Share on other sites More sharing options...
LarsJ Posted March 21, 2018 Author Share Posted March 21, 2018 It's not possible to display a treeview in a column of a listview. This process explorer control seems to be a combination of a treeview and a listview but separated as two controls. The scrollbars are removed in the treeview. The horizontal scrollbar belongs to the listview. The rows in the treeview and listview are synchronized. The listview is probably a virtual listview (easy to update dynamically). I'll not deny that it's possible to create a similar control in AutoIt, but it'll not be quite easy. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kklee69 Posted March 22, 2018 Share Posted March 22, 2018 In the Virtual listviews , It is possible to add icons to SubItem AND 0-based index of the item with NO icons Is there any sample? Link to comment Share on other sites More sharing options...
LarsJ Posted March 22, 2018 Author Share Posted March 22, 2018 Take a look at LvVirtArrayIcons.au3 in zip-file in first post. Modify the example to handle subitem icons. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kklee69 Posted March 22, 2018 Share Posted March 22, 2018 (edited) I found a solution Thanks for help But I encountered two problems again 1. first column (0 column) has a blank icon I hope there is no blank icon 2._GUICtrlListView_SetImageList -------------------------------------------------------- [optional] Type of image list: 0 - Image list with large icons 1 - Image list with small icons 2 - Image list with state images ------------------------------------------------------- I already know how to use Type 1 and Type 2 Is there a way to use Type 0? Because I want to create two ImageLists using Type 0 and Type 1 And then select an icon using TYPE1 or TYPE0 in LISTVIEW Is there a way to achieve it? Edited March 23, 2018 by kklee69 Link to comment Share on other sites More sharing options...
kklee69 Posted April 1, 2018 Share Posted April 1, 2018 Like I said, your Virtual listviews helped me a lot thank you very much I usually use [Data stored in arrays ] Add MSSQL SERVER I USE [ $conn.Execute ("SELECT * FROM DB1 ").GetRows ] TO PUT data INTO Arrays However, when the data is large , It is still very slow So I want to read data in batches Then I saw [Data stored in databases] ,It's what I want But your example is for SQLlite I spent a lot of time and I can't convert it to MSSQL Can you give me an example for MSSQL ? Link to comment Share on other sites More sharing options...
LarsJ Posted April 2, 2018 Author Share Posted April 2, 2018 I think the problem is the same as discussed here and in the following posts. Study these posts. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kklee69 Posted April 4, 2018 Share Posted April 4, 2018 I find a way to connect MS SQL However, I encountered a noise on the screen. LIKE THIS How do I fix it Is it a problem with my program or does it need to redraw? Link to comment Share on other sites More sharing options...
LarsJ Posted April 5, 2018 Author Share Posted April 5, 2018 This is definitely because there is an error in the code in $LVN_ODCACHEHINT or $LVN_GETDISPINFO sections or in the row-relation table. Add some ConsoleWrite's to see what's going on. To make debugging easier you should adjust the height of the listview to match an integral number of rows eg. 10 or 15 (no half rows) and you should limit the number of rows extracted from the database to 100. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kklee69 Posted April 5, 2018 Share Posted April 5, 2018 (edited) I already know why Thank you for your remind First need to GET $iFrom 0 TO 15 ,That means 16 item But my data starts at 1 ,So the data is only 15 item $tagNMLVCACHEHINT = $tagNMHDR & ";int iFrom;int iTo" SO $LVN_ODCACHEHINT Only use int ?? Can I use text(char) as a Serial number ? like NAME ?? for example SQL " SELECT * FROM people Where Name > 'A' AND Name < 'C' " Or use data of Subitem 0 as a Serial number ?? Or can I increase the number of buffered ITEMs? Maybe read 100 ITEMs at once This will reduce the number of communications with the SERVER Edited April 7, 2018 by kklee69 Link to comment Share on other sites More sharing options...
LarsJ Posted April 27, 2018 Author Share Posted April 27, 2018 A new UDF versions section added to bottom of first post. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
Iczer Posted April 30, 2019 Share Posted April 30, 2019 can i have small example on search function for $LVN_ODFINDITEM notifications in database-powered ListView: "SELECT DisplayView.Hash,Title,Date,Subject FROM DisplayView INNER JOIN DisplayMemDb.RowRelation ON DisplayView.Hash = DisplayMemDb.RowRelation.Hash WHERE DisplayMemDb.RowRelation.rowid BETWEEN " & $sFrom & " And " & $sTo & ";" Search function should return listview item id, but how i can retrieve rowid from DisplayMemDb.RowRelation table - all i get is : err msg : 'no such table: DisplayMemDb.RowRelation' err str : 'SQL logic error' in responce to query : "SELECT rowid FROM DisplayMemDb.RowRelation WHERE ... Link to comment Share on other sites More sharing options...
LarsJ Posted April 30, 2019 Author Share Posted April 30, 2019 Note that LVN_ODFINDITEM is usually only used to find a specific row when the rows are already sorted alphabetically. If you press m on the keyboard then the first row containing m in the first character will become the first visible row in the listview. Your function should simply return the listview index of this row. If you want to see an example, then create a simple example and then I'll add the LVN_ODFINDITEM function. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
Iczer Posted May 1, 2019 Share Posted May 1, 2019 expandcollapse popup#include <GuiListView.au3> #include <FontConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <TreeViewConstants.au3> #include <WindowsConstants.au3> #include <GuiTreeView.au3> #include <SQLite.au3> #include <Math.au3> #include <GDIPlus.au3> $hDLL_Crypt32 = DllOpen("Crypt32.dll") $hDLL_ntdll = DllOpen("ntdll.dll") $hDLL_gdi32 = DllOpen("gdi32.dll") Global Const $sSqlBuild_Table = "(GroupTitle TEXT COLLATE NOCASE, Hash TEXT PRIMARY KEY NOT NULL, Title TEXT COLLATE NOCASE, Date TEXT, Subject TEXT COLLATE NOCASE, UnixTimeStamp INTEGER, IsRead INTEGER DEFAULT 0)" Global Const $sSqlFill_Table = "(GroupTitle, Hash, Title, Date, Subject, UnixTimeStamp)" Global Const $iRowsMAX = 10000 Global Const $tagNMLVCACHEHINT = $tagNMHDR & ";int iFrom;int iTo" Global $aListView, $hListView, $TreeView_SelTitle, $aTreeViewState[19][8] = [[18,"","","","","","",""]], $sSelectedTVIndex = 3 Global $hListView_ImageList, $hTreeViewFont, $hTreeViewFontBold, $hListViewFont, $hListViewFontBold For $i = 1 To $aTreeViewState[0][0] $aTreeViewState[$i][0] = 3 ; icon num in "shell32.dll" $aTreeViewState[$i][1] = 0x000000 ; item text color $aTreeViewState[$i][2] = 0 ; text is bold (or not) $aTreeViewState[$i][3] = 0 ; some additional text $aTreeViewState[$i][5] = "Group Title " & $i; name Next if FileExists("Test.sqlite") Then FileDelete("Test.sqlite") CreateDB($iRowsMAX) _SQLite_Startup() _SQLite_Open( "Test.sqlite" ) _SQLite_SetTimeout(-1, 888888) _SQLite_Exec(-1, "ATTACH DATABASE ':memory:' AS DisplayMemDb;" ) _GDIPlus_Startup() Opt("GUIOnEventMode", 1) #Region ### START Koda GUI section ### Form= Global $Form1 = GUICreate("Form1", 881, 516, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close") Global $hTreeView = _GUICtrlTreeView_Create($Form1, 8, 16, 319, 489, BitOR($GUI_SS_DEFAULT_TREEVIEW,$WS_HSCROLL,$WS_VSCROLL, $TVS_SHOWSELALWAYS,$WS_HSCROLL,$WS_BORDER, $TVS_INFOTIP), BitOR($WS_EX_CLIENTEDGE,$WS_EX_STATICEDGE)) $TreeView_Root_1 = _GUICtrlTreeView_Add($hTreeView, 0, "Root - 1") _GUICtrlTreeView_SetIcon($hTreeView, $TreeView_Root_1, "shell32.dll", 4) $TreeView_Root_2 = _GUICtrlTreeView_Add($hTreeView, 0, "Root - 2") _GUICtrlTreeView_SetIcon($hTreeView, $TreeView_Root_2, "shell32.dll", 4) ControlCreateFonts($hTreeView, $hTreeViewFont, $hTreeViewFontBold) Global $idListView = GUICtrlCreateListView("hash|Title|Time|Subject", 336, 16, 538, 486, BitOR($LVS_OWNERDATA,$LVS_SHOWSELALWAYS));,$LVS_SINGLESEL _GUICtrlListView_SetExtendedListViewStyle( $idListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE)) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 0) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 310) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 88) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 112) GUICtrlSetOnEvent(-1, "ListViewClick") SetIconListToListView() $hListView = GUICtrlGetHandle($idListView) ControlCreateFonts($hListView, $hListViewFont, $hListViewFontBold) Local $idTVContextMenu = GUICtrlCreateContextMenu(GUICtrlCreateDummy()) $hTVContextMenu = GUICtrlGetHandle($idTVContextMenu) Local $idTVContextMenu_Refresh = GUICtrlCreateMenuItem("Refresh", $idTVContextMenu) Local $idTVContextMenu_Rename = GUICtrlCreateMenuItem("Rename", $idTVContextMenu) GUICtrlCreateMenuItem("", $idTVContextMenu) ; separator Local $idTVContextMenu_MarkALLRead = GUICtrlCreateMenuItem("Mark ALL Items Read", $idTVContextMenu) Local $idTVContextMenu_MarkALLUnRead = GUICtrlCreateMenuItem("Mark ALL Items UnRead", $idTVContextMenu) GUIRegisterMsg($WM_NOTIFY, "LWS_WM_NOTIFY") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### SubFunction_FillTreeView() While 1 Sleep(100) WEnd Func Form1Close() GUIRegisterMsg( $WM_NOTIFY, "" ) ; DllClose($hDLL_Crypt32) DllClose($hDLL_ntdll) _GDIPlus_Shutdown() _SQLite_Close() _SQLite_Shutdown() Exit EndFunc ;========================================================================================== Func ListViewClick() EndFunc ;========================================================================================== Func SubFunction_FillTreeView() Local $idTVItem[$aTreeViewState[0][0]+1] = [$aTreeViewState[0][0]] _GUICtrlTreeView_BeginUpdate($hTreeView) _GUICtrlTreeView_DeleteChildren($hTreeView, $TreeView_Root_1) _GUICtrlTreeView_DeleteChildren($hTreeView, $TreeView_Root_2) _GUICtrlTreeView_SetTextColor($hTreeView, 0x77B5FE) ; color of additional text For $i = 1 To $aTreeViewState[0][0] Switch Mod($i,2) Case 0 $idTVItem[$i] = _GUICtrlTreeView_AddChild($hTreeView,$TreeView_Root_2, $aTreeViewState[$i][5]) Case Else $idTVItem[$i] = _GUICtrlTreeView_AddChild($hTreeView,$TreeView_Root_1, $aTreeViewState[$i][5]) EndSwitch Switch Mod($i,3) Case 0 $aTreeViewState[$i][2] = 0 Case Else $aTreeViewState[$i][2] = 1 EndSwitch _GUICtrlTreeView_SetItemParam($hTreeView, $idTVItem[$i], $i) _GUICtrlTreeView_SetIcon($hTreeView, $idTVItem[$i], "shell32.dll", $aTreeViewState[$i][0]) Next _GUICtrlTreeView_Expand($hTreeView, $TreeView_Root_1, True) _GUICtrlTreeView_EndUpdate($hTreeView) _GUICtrlTreeView_ClickItem($hTreeView, $idTVItem[$sSelectedTVIndex]) SubFunction_FillListView() EndFunc ;========================================================================================== Func SubFunction_FillListView_Delayed() AdlibUnRegister("SubFunction_FillListView_Delayed") SubFunction_FillListView() EndFunc ;========================================================================================== Func SubFunction_FillListView() Local $iTVSelIndex = _GUICtrlTreeView_GetItemParam($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView)) _SQLite_Exec( -1, "DROP VIEW IF EXISTS DisplayView;" ) _SQLite_Exec( -1, "DROP TABLE IF EXISTS DisplayMemDb.RowRelation;" ) _SQLite_Exec( -1, "CREATE TEMP VIEW DisplayView AS SELECT Hash,Title,Date,Subject,IsRead,GroupTitle FROM lvdata WHERE GroupTitle IS '" & $aTreeViewState[$iTVSelIndex][5] & "' ORDER BY UnixTimeStamp DESC;" ) _SQLite_Exec( -1, "CREATE TABLE DisplayMemDb.RowRelation AS SELECT Hash FROM DisplayView;" ) GUICtrlSendMsg($idListView, $LVM_SETITEMCOUNT, $aTreeViewState[$iTVSelIndex][3] , 0) EndFunc ;========================================================================================== Func LWS_WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam ) Local Static $tText = DllStructCreate( "wchar[512]" ) Local Static $pText = DllStructGetPtr( $tText ) Local Static $aResult, $iRows, $iFrom, $tRectLVI = DllStructCreate( $tagRECT ), $pRectLVI = DllStructGetPtr( $tRectLVI ) Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $VKey $tNMHDR = DllStructCreate( $tagNMHDR, $lParam ) $hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) ) $iCode = DllStructGetData( $tNMHDR, "Code" ) Switch $hWndFrom Case $hTreeView Switch $iCode Case $NM_CUSTOMDRAW Local $tNMTVCUSTOMDRAW = DllStructCreate($tagNMTVCUSTOMDRAW, $lParam) Local $dwDrawStage = DllStructGetData($tNMTVCUSTOMDRAW, "DrawStage") Switch $dwDrawStage ; Holds a value that specifies the drawing stage Case $CDDS_PREPAINT ; Before the paint cycle begins Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any item-related drawing operations Case $CDDS_ITEMPREPAINT ; Before painting an item Local $hItemSpec = DllStructGetData($tNMTVCUSTOMDRAW, "ItemSpec") ; $hItemSpec = $hItem Local $iItemState = DllStructGetData($tNMTVCUSTOMDRAW, "ItemState") Local $iItemParam = DllStructGetData($tNMTVCUSTOMDRAW, "ItemParam") ; ItemParam = index in array Local $hDC = DllStructGetData($tNMTVCUSTOMDRAW, "HDC") ; Handle to the item's device context $iSelected = DllCall( "user32.dll", "lresult", "SendMessageW", "hwnd", $hTreeView, "uint", $TVM_GETITEMSTATE, "wparam", $hItemSpec, "lparam", $TVIS_SELECTED )[0] ; Selected state If BitAND( $iSelected, $TVIS_SELECTED ) Then Return $CDRF_NOTIFYPOSTPAINT ;If Not BitAnd( $iItemState, $CDIS_FOCUS ) Then DllStructSetData( $tNMTVCUSTOMDRAW, "ClrText", $aTreeViewState[$iItemParam][1] ) ; Forecolor of item text ;DllStructSetData( $tNMTVCUSTOMDRAW, "clrTextBk",$aTreeViewState[$iItemParam][1] ) ; Backcolor of item text Local $tRECT = _GUICtrlTreeView_DisplayRectEx ( $hTreeView, $hItemSpec, True) DllStructSetData( $tRECT, "Left", DllStructGetData( $tRECT, "Right") + 7) DllStructSetData( $tRECT, "Right", DllStructGetData( $tRECT, "Right") + 188) _WinAPI_DrawText( $hDC, $aTreeViewState[$iItemParam][3], $tRECT, $DT_LEFT ) ; and background color of the device context. _GUICtrlTreeView_SetBold ($hTreeView, $hItemSpec, $aTreeViewState[$iItemParam][2]) ;Else ;_GUICtrlTreeView_SetBold ($TreeView, $hItemSpec, $aTreeViewState[$iItemParam][2]) ;EndIf Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors Case $CDDS_ITEMPOSTPAINT Local $hItemSpec = DllStructGetData($tNMTVCUSTOMDRAW, "ItemSpec") ; $hItemSpec = $hItem Local $iItemState = DllStructGetData($tNMTVCUSTOMDRAW, "ItemState") Local $iItemParam = DllStructGetData($tNMTVCUSTOMDRAW, "ItemParam") ; ItemParam = index in array Local $hDC = DllStructGetData($tNMTVCUSTOMDRAW, "HDC") ; Handle to the item's device context Local $tRECT = _GUICtrlTreeView_DisplayRectEx( $hTreeView, $hItemSpec, True) DllStructSetData( $tRECT, "Left", DllStructGetData( $tRECT, "Right") + 7) DllStructSetData( $tRECT, "Right", DllStructGetData( $tRECT, "Right") + 188) ;DllStructSetData( $tNMTVCUSTOMDRAW, "ClrText", $aTreeViewState[$iItemParam][1] ) ; Forecolor of item text DllCall( "gdi32.dll", "int", "SetTextColor", "handle", $hDC, "int", 0xFEB577 ) ; 0x77B5FE _WinAPI_SelectObject( $hDC, $aTreeViewState[$iItemParam][2] ? $hTreeViewFontBold : $hTreeViewFont ) ; Bold/normal font _WinAPI_DrawText( $hDC, $aTreeViewState[$iItemParam][3], $tRECT, $DT_LEFT ) ; and background color of the device context. _GUICtrlTreeView_SetBold ($hTreeView, $hItemSpec, $aTreeViewState[$iItemParam][2]) Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors EndSwitch Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW AdlibRegister("SubFunction_FillListView_Delayed",300) _WinAPI_RedrawWindow($hTreeView) Case $NM_RCLICK Local $tMPos = _WinAPI_GetMousePos(True, $hWndFrom) Local $hItem = _GUICtrlTreeView_HitTestItem($hWndFrom, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) If $hItem <> -1 And $hItem <> 0x0 Then DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hTVContextMenu, "int", 0, "int", MouseGetPos(0), "int", MouseGetPos(1), "hwnd", $Form1, "ptr", 0) EndIf EndSwitch Case $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $tNMLVCUSTOMDRAW = DllStructCreate( $tagNMLVCUSTOMDRAW, $lParam ) $iItem = DllStructGetData( $tNMLVCUSTOMDRAW, "dwItemSpec" ) ; Item index Switch DllStructGetData( $tNMLVCUSTOMDRAW, "dwDrawStage" ) Case $CDDS_PREPAINT ; Before the paint cycle begins Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window before an item is painted Case $CDDS_ITEMPREPAINT ; Before an item is painted If Mod( $iItem, 2 ) = 0 Then DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF ) Else DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xF8FFF8 ) EndIf Return $CDRF_NOTIFYITEMDRAW Case $CDDS_SUBITEM,BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before an item is painted $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index If $iSubItem = 1 Then Return $CDRF_NOTIFYPOSTPAINT EndIf If GUICtrlSendMsg( $idListView, $LVM_GETITEMSTATE, $iItem, $LVIS_SELECTED ) Then; Selected item Return $CDRF_NOTIFYSUBITEMDRAW ; Custom drawing of selected items EndIf Return $CDRF_NEWFONT ; Default drawing of other items Case $CDDS_ITEMPOSTPAINT,BitOR($CDDS_ITEMPOSTPAINT, $CDDS_SUBITEM) ; After an item has been painted $hDC = DllStructGetData( $tNMLVCUSTOMDRAW, "hdc" ) ; Device context $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index If $iSubItem = 1 Then $iItem = DllStructGetData( $tNMLVCUSTOMDRAW, "dwItemSpec" ) ; Subitem rectangle DllStructSetData( $tRectLVI, "Top", $iSubItem ) DllStructSetData( $tRectLVI, "Left", $LVIR_ICON ) GUICtrlSendMsg( $idListView, $LVM_GETSUBITEMRECT, $iItem, $pRectLVI ) _GUIImageList_Draw( $hListView_ImageList, 0, $hDC, DllStructGetData( $tRectLVI, "Left" ), DllStructGetData( $tRectLVI, "Top" ) + 1 ) Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors EndIf EndSwitch Case $LVN_GETDISPINFOW Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam ) Local $iItem = DllStructGetData( $tNMLVDISPINFO, "Item" ) Local $iSubItem = DllStructGetData( $tNMLVDISPINFO, "SubItem" ) Local $iMask = DllStructGetData( $tNMLVDISPINFO, "Mask" ) If BitAND( $iMask, $LVIF_TEXT ) Then $iIndex = $iItem - $iFrom + 1 If $iIndex > 0 And $iIndex < $iRows + 1 Then Local $sItem = $aResult[$iIndex][$iSubItem] DllStructSetData( $tText, 1, $sItem ) DllStructSetData( $tNMLVDISPINFO, "Text", $pText ) DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) ) EndIf EndIf If BitAND( $iMask, $LVIF_IMAGE ) And ($iSubItem = 1) Then $iIndex = $iItem - $iFrom + 1 If $iIndex > 0 And $iIndex < $iRows + 1 Then DllStructSetData( $tNMLVDISPINFO, "Image", 0) EndIf EndIf Case $LVN_ODCACHEHINT Local $tNMLVCACHEHINT = DllStructCreate( $tagNMLVCACHEHINT, $lParam ), $iColumns $iFrom = DllStructGetData( $tNMLVCACHEHINT, "iFrom" ) Local $sSQL = "SELECT DisplayView.Hash,Title,Date,Subject,IsRead,GroupTitle FROM DisplayView INNER JOIN RowRelation ON DisplayView.Hash = RowRelation.Hash WHERE RowRelation.rowid BETWEEN " & (DllStructGetData( $tNMLVCACHEHINT, "iFrom" ) + 1) & " And " & (DllStructGetData( $tNMLVCACHEHINT, "iTo" ) + 1) & ";" _SQLite_GetTable2d( -1, $sSQL, $aResult, $iRows, $iColumns ) Case $LVN_ODFINDITEMW Local $tNMLVFINDITEM = DllStructCreate( $tagNMLVFINDITEM, $lParam ) If BitAND( DllStructGetData( $tNMLVFINDITEM, "Flags" ), $LVFI_STRING ) Then Local $sSearchString = DllStructGetData( DllStructCreate( "wchar[512]", DllStructGetData( $tNMLVFINDITEM, "Text" ) ), 1 ) If StringLen($sSearchString) > 3 Then Return SearchText( DllStructGetData( $tNMLVFINDITEM, "Start" ), $sSearchString) Else Return -1 EndIf EndIf EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;============================================================================================================================================================================================== Func SetIconListToListView() Local $hItemIcon_Item0 = _GDIPlus_BitmapCreateFromMemory(GetIcon_ListView_Item0(), True) Local $hItemIcon_Item1 = _GDIPlus_BitmapCreateFromMemory(GetIcon_ListView_Item1(), True) Local $hItemIcon_Item2 = _GDIPlus_BitmapCreateFromMemory(GetIcon_ListView_Item2(), True) $hListView_ImageList = _GUIImageList_Create(16, 16, 5, 3) _GUIImageList_Add($hListView_ImageList, $hItemIcon_Item0) _GUIImageList_Add($hListView_ImageList, $hItemIcon_Item1) _GUIImageList_Add($hListView_ImageList, $hItemIcon_Item2) _GUICtrlListView_SetImageList($idListView, $hListView_ImageList, 1) _WinAPI_DeleteObject($hItemIcon_Item0) _WinAPI_DeleteObject($hItemIcon_Item1) _WinAPI_DeleteObject($hItemIcon_Item2) EndFunc ;============================================================================================================================================================================================== Func GetIcon_ListView_Item0() Local $AleciveFlatwokenAppsFileNewsico $AleciveFlatwokenAppsFileNewsico &= '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' $AleciveFlatwokenAppsFileNewsico &= 'cCUzTXMicSZYoLS4sgAxaLWwLNoA5OT/6/Hw/+wE8fE9AP5laGibRaAHC/EHzOXk8gewRMrJcn2vycmyB6XjsD85fa/JyPIFMRIxAouxcXEAnvAGj6Ok8iMIrcbGchvT3Nz/EQ8A///+AAB3eHgwngEBAbIHAQDO5o/zB/EvsSdxF2h1efIGOHyMj3IGcVgxrIibip3yQa+wCnqKjbIZCIWXmnBwy/95icaM8o2xCOfr678HsweGnbkHAQDR5+atcQTR8QWWq61wBY5yV7ENOH+QkzIR8QUxAnaFIIj/kqaoMi19jgaRcm4xTZOoqf94jIeLsmoxe+rv778HGHh4nL0HAQDV6OcQccXi4PIHbXt/8P+QpaayMPUHMVCxaSK8MG57i45ymXaFGIn/pDA9MXt8jZC3ckqxD/EHm/wHtAebvwcBAwCerKsT0ujn4vBxJoKUlrKL8SexHviDlZeyrjEVcRdxEXFsf7Fc8R6xEbEAcQAxAvVt8hz4+L8HDwAGANjp6OBaz+fl/b+KPwA/AIc/APEHsQd4eHiasAcGCh8HDwDa6ula1/jr6fDwSD8FPwA/APsHHbEHmb8HDwAJAKm1tCAT3u7scjAArduI7eu+MwDsvtw/AIa/PwA3AIeMi4i/Bw8PAA8ADwALAF+zAgBKAPAAAAfgAIAAA8AAAAGAAB6rTAYBUwMAAwcAAw8AA6ofAGc/AG9/AHf/AQCqKAAnEAADIAADAQIFARoABBYZGU08RgBFjEBJSZE/SSBJkD9JSIUBjz8CSIIBjj5IR448qEVEjIAVYIAZFQUeAE1YWJC619X9gMLg3v/D4d+aAaGBEbrW1P2AGa0AHQAUHSEhLbfT0QD9ma6v/6G4uQGCEZyzs/+jursA/63Hxv+mvr4C/4ENt9PS/7DKAMn/ma+w/7jUANP/vdrY/RgbABtdZHNyXLzZGNf/mIARgQGvyckQ/5yys4IForm6C4Ifhw3Igg2mv7//AYEZQ05Ni3GCgQBfvNjX/5qwsQHCC7LNzP+Xra4jwhzBA6O7u8Ilo7tivMIjn7a2wgbAH/8ASFNSjHKDgl+Au9fW/4+jpcItgLjU0v+VqqvGDwHBC5Ooqf+hubkBwC/K/6W9vf+oAMHB/8De3P9JgFNTi3SFhF/JLwCuyMj/qMi//wimxrzGALHTyf8Irs/FwgaasbH/AKnCwv/B393/gElUU4p2hoXCLwiXrK3CD6zGxf8AnMit/5fDp/8AptK2/5/Lr/8AlsOm/5TBpP8GrsA/xRm72Nb/RkBQT4l3h4bCL5QBwCybsbL/sczLAP+xyrv/t8y9AP+9yMD/scm6AP+u2b3/rtK7EP+rxcTGGaW/vkD/P0dHiHjAD7kM1tTCZcFKudXU/wDa2NH/6uTZ/wDp49r/6OPb/wDb2tD/xsXC/wauwE/BCYmdnv+hALq4/z9IR4d4HojAD8AMwWTBALbR0ED/2OLa/9rAANsPwA7BAcUCwQaYr6//gIyhof+iu7rBDxCFeYiHwj+dtLRHwljBXMEBpLy9wAC8EcJbnbS1wHC4/9hA4+P/9fj4wgDTANbW5hkaGix7wIiIW77c2sJ84TaAjaCi/7POzeIAAIyfof+yzMz/AI2ho/+qw8P/CPP29mJr3d3d5hAeHh4tYV9gaGcAIcDb2fuQpaYc/6RgDeFA4TOVqqwj4iThHZ+3t2JW9vkK+WUHLIlvtcXEbBDJ5OL7fWfW2tkK5WAHKxF4Z25uIQCJk5JaiZSTXxVhAIpmAJRkAJNfJ8goKCTtBoABY4ofABMEAOAFAANgBgcAAADADwAA' $AleciveFlatwokenAppsFileNewsico = _WinAPI_Base64Decode($AleciveFlatwokenAppsFileNewsico) Local $tSource = DllStructCreate('byte[' & BinaryLen($AleciveFlatwokenAppsFileNewsico) & ']') DllStructSetData($tSource, 1, $AleciveFlatwokenAppsFileNewsico) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 5430) $tSource = 0 Return Binary(DllStructGetData($tDecompress, 1)) EndFunc ;============================================================================================================================================================================================== Func GetIcon_ListView_Item1() Local $AleciveFlatwokenAppsUnlockico ;$AleciveFlatwokenAppsUnlockico &= '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' ;$AleciveFlatwokenAppsUnlockico &= 'PwA/AD8ABz4AsQQxBYfK6vU7aFBagKAGDO/fAwB7AKe8E6Xd93KjANz3rZ7b976euNv4vz8APwAxAJ89AALccQD3vpXH37IAY4STfxYeIiZ4AQICNhcPAA8ADwDQsgIASgDwAAAH4ACAAAPAAAABgAAer10GAWcBbwF3/wAAKAATahAAAyAAAwECBRoABAAEEBlMDS1GixANMEuRgQEMKUEQkQokOY8BIjaOUAMME1+AGRQFHhMAPFuQLJPj/S4Am/D/Lpvx/ysAkOD/I3e5/yMEdriQAbf/InCtIP0PLkatgSEIFwAiLTGZ6P0xngTx/4EBLZPg/yVAern/JXm4mwF1ALH9BQ8WXB5SQHpcNKHx/4EBN8Ci8v/3+/4BfxIAAPf6/P8rfbr/CCh7uIIBDytAiwAkYItfN6Py/4GBATql8v/8/ccPONLq+8IABQDBBi5/ILr/Kn25wgARLwBEjCZjjV86pgPADsAAPqjy//7+cccPh8n2wgAFAMEGMUCCuv8sf7nCABIAMEWLKmaPXz1IqfL/wQBAqssfbwy/9cIAyR8xg7r/CC6BucIAFDJGisAuaZBfQKzADsAA6EWu8so7/cAbwQAJAAg2hrrAELn/NIwAxf8bQFeJM2xAkF9CrvP/wQBEAK/y/6na+f+vAN35/6vT6/+oRMvhwgC51efCDqUQyuD/NMAPNo7GAP9BrO//HkNbAIg4b5FfRbHzAv/JAECj4P81iCC7/zWHusIAXJ4Cx8IPPoy8/zmQCsbAGe/CCSFFW4cAPXKRX0i08/8BxQBKtfL/0eTwAP9gocj/N4m6EcIAaKbLwj4/lccQ/0ex78YKI0ZbAIVBdZFfS7fzAv/JAMTn+v/W52Dw/2amycIAwQLCQOP0/0q078oJJQBIW4RId5BbTgi58//JAFi98//gu+T6//VgSWEAYQEDYQLtBChHWH1BXgBsIV7B9PtRvAz0/38AZwBcvvH8EBMcIT/hZ3uzzwBsZ8b1+1S/9AL/fwD0/2bD8fxQO1tqhUAHAmVwTABmcyFkiJlbZAiJm195AF1+jlyQHykuKeUGgAHjhwcfAAsAYo4DAAA=' $AleciveFlatwokenAppsUnlockico &= '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' $AleciveFlatwokenAppsUnlockico &= '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' $AleciveFlatwokenAppsUnlockico &= 'sOIdIkpCfTtfQFghSsqy++YP0wK6YhZJ28T/S90ix2AAxv9J4AlG1oC+/0PSuf9B4A8B4iTGrvwSHRs/AeFnbrapbFTPuIr7YRND4B9F1LxiCFhI2MFiAGEHROASQgTPt2IkUsu1/DQoXFWFQAcCZXBFaABiIVyMg1tdjgCFX16Phl9ekOCHX1+QiGIAYQFhAgFhA1aBeVwcKifyKeUGgAHjhx8ACwBijgADAAA=' $AleciveFlatwokenAppsUnlockico = _WinAPI_Base64Decode($AleciveFlatwokenAppsUnlockico) Local $tSource = DllStructCreate('byte[' & BinaryLen($AleciveFlatwokenAppsUnlockico) & ']') DllStructSetData($tSource, 1, $AleciveFlatwokenAppsUnlockico) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 5430) $tSource = 0 Return Binary(DllStructGetData($tDecompress, 1)) EndFunc ;============================================================================================================================================================================================== Func GetIcon_ListView_Item2() Local $AleciveFlatwokenAppsMahjonggico $AleciveFlatwokenAppsMahjonggico &= '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' $AleciveFlatwokenAppsMahjonggico &= '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' $AleciveFlatwokenAppsMahjonggico &= 'BXEAfWQAc4WIXCbIKywp5QaAAeOHHwADCwBijgMAAA==' $AleciveFlatwokenAppsMahjonggico = _WinAPI_Base64Decode($AleciveFlatwokenAppsMahjonggico) Local $tSource = DllStructCreate('byte[' & BinaryLen($AleciveFlatwokenAppsMahjonggico) & ']') DllStructSetData($tSource, 1, $AleciveFlatwokenAppsMahjonggico) Local $tDecompress _WinAPI_LZNTDecompress($tSource, $tDecompress, 5430) $tSource = 0 Return Binary(DllStructGetData($tDecompress, 1)) EndFunc ;============================================================================================================================================================================================== Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall($hDLL_Crypt32, "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall($hDLL_Crypt32, "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode ;============================================================================================================================================================================================== Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize) $tOutput = DllStructCreate("byte[" & $iBufferSize & "]") If @error Then Return SetError(1, 0, 0) Local $aRet = DllCall($hDLL_ntdll, "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0) If @error Then Return SetError(2, 0, 0) If $aRet[0] Then Return SetError(3, $aRet[0], 0) Return $aRet[6] EndFunc ;==>_WinAPI_LZNTDecompress ;============================================================================================================================================================================================== Func CreateDB( $iRows = 100000 ) ConsoleWrite("Generating DB..." & @CRLF) _SQLite_Startup() _SQLite_Open( "Test.sqlite" ) _SQLite_Exec( -1, "PRAGMA synchronous = OFF;" ) Local $sSQL = "CREATE TABLE lvdata " & $sSqlBuild_Table & ";" _SQLite_Exec( -1, $sSQL ) $iRows = $iRows/$aTreeViewState[0][0] Local $n = ($iRows > 888)?(8888):(888), $p = 0, $q = -1 Local $sItemTitle,$sItemDate,$sItemSubject,$iItemTimeStamp For $f = 1 To $aTreeViewState[0][0] $sGroupTitle = $aTreeViewState[$f][5] $aTreeViewState[$f][3] = 0 For $i = 0 To $iRows-1 Step $n $k = (($i+$n) > $iRows) ? ($iRows-$i-2) : ($n-2) $sQuery = 'INSERT OR IGNORE INTO lvdata ' & $sSqlFill_Table & ' VALUES ' For $j = 0 To $k $iItem = $i+$j $aTreeViewState[$f][3] += 1 $sItemTitle = "Item Title " & $f & "-" & $iItem $sItemDate = "08.08.8888" $sItemSubject = "Any" $iItemTimeStamp = 155888333 - $iItem $sHash = $sGroupTitle & $sItemTitle & $iItemTimeStamp $sQuery &= "('" & $sGroupTitle & "','" & $sHash & "','" & $sItemTitle & "','" & $sItemDate & "','" & $sItemSubject & "'," & $iItemTimeStamp & ")," Next $iItem = $i+$k+1 $aTreeViewState[$f][3] += 1 $sItemTitle = "Item Title " & $f & "-" & $iItem $sItemDate = "08.08.8888" $sItemSubject = "Any" $iItemTimeStamp = 155888333 - $iItem $sHash = $sGroupTitle & $sItemTitle & $iItemTimeStamp $sQuery &= "('" & $sGroupTitle & "','" & $sHash & "','" & $sItemTitle & "','" & $sItemDate & "','" & $sItemSubject & "'," & $iItemTimeStamp & ");" If Not (_SQLite_Exec(-1, $sQuery) = $SQLITE_OK) Then MsgBox($MB_SYSTEMMODAL, "SQLite Error", "Error Code: " & _SQLite_ErrCode() & @CRLF & "Error Message: " & _SQLite_ErrMsg() & @CRLF & @CRLF & "Cancelling table generation...") Return SetError(5) EndIf Next Next _SQLite_Close( -1 ) ConsoleWrite("Generating DB... Done." & @CRLF) EndFunc Func ControlCreateFonts(ByRef $hWndCTRL, ByRef $hFont, ByRef $hFontBold) Local $hDC = _WinAPI_GetDC( $hWndCTRL ) $hFont = _SendMessage( $hWndCTRL, $WM_GETFONT ) Local $hObject = _WinAPI_SelectObject( $hDC, $hFont ) Local $lvLOGFONT = DllStructCreate( $tagLOGFONT ) DllCall( 'gdi32.dll', 'int', 'GetObjectW', 'ptr', $hFont, 'int', DllStructGetSize( $lvLOGFONT ), 'ptr', DllStructGetPtr( $lvLOGFONT ) ) _WinAPI_SelectObject( $hDC, $hObject ) _WinAPI_ReleaseDC( $hWndCTRL, $hDC ) $TreeViewFont = _WinAPI_CreateFontIndirect( $lvLOGFONT ) Local $iWeight = BitOR( DllStructGetData( $lvLOGFONT, "Weight" ), $FW_BOLD ) DllStructSetData( $lvLOGFONT, "Weight", $iWeight ) $hFontBold = _WinAPI_CreateFontIndirect( $lvLOGFONT ) EndFunc Thanks! Idea is to send LVM_FINDITEM message from another thread and make ListView jump to the found item in currently loaded items (selected GroupTitle). Ideally ListView should not react/search to strings shorter than 3 letters, only valid keys - arrow keys for navigation Link to comment Share on other sites More sharing options...
powerofos Posted August 24, 2019 Share Posted August 24, 2019 (edited) Hi LarsJ, Please refer to the attachment. Question is based on the virtual listview database model. 1. How to fix the customdraw problem? 2. In order to get the listview subitem ID, I have to regist the listview callback function, any other good idea? 3. How to get Item/subitem data form virtual listview in NM_CLICK? Thanks Regards Virtual listview customdraw problem.rar Edited August 24, 2019 by powerofos Link to comment Share on other sites More sharing options...
Inpho Posted August 30, 2019 Share Posted August 30, 2019 (edited) Subbed. Thanks for this LarsJ, I've shaved 12 seconds off of my time loading a 35,000 x 10 array into a listview (was also some optimisations in the removal of blank rows from the array at the same time, but making the listview dynamic has saved most of that time). EDIT: Huh I was already subbed but wasn't receiving notifications. Well, a different means to the same end... Now to get the incremental search working Edited August 30, 2019 by Inpho Link to comment Share on other sites More sharing options...
banged Posted November 14, 2019 Share Posted November 14, 2019 (edited) Hi, last days i use virtual listview and i have a problem, i can't get item text (_GUICtrlListView_GetItemText ) from selected item If i use msgbox in WM_Notify, when select a item, then return NULL, but the 2nd msgbox return current result expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #include <Array.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> ;Opt( "MustDeclareVars", 1 ) Global $hGui, $hEdit, $idEditSearch, $hLV, $iItems = 1000, $aItems[$iItems], $aSearch[$iItems], $iSearch = 0 Example() Func Example() ; Create GUI $hGui = GUICreate( "Virtual ListView search", 300, 230 ) ; Create Edit control Local $idEdit = GUICtrlCreateEdit( "", 10, 10, 300-20, 20, BitXOR( $GUI_SS_DEFAULT_EDIT, $WS_HSCROLL, $WS_VSCROLL ) ) $hEdit = GUICtrlGetHandle( $idEdit ) $idEditSearch = GUICtrlCreateDummy() ; Handle $WM_COMMAND messages from Edit control ; To be able to read the search string dynamically while it's typed in GUIRegisterMsg( $WM_COMMAND, "WM_COMMAND" ) ; Create ListView Local $idLV = GUICtrlCreateListView( "", 10, 40, 300-20, 200-20, $LVS_OWNERDATA, BitOR( $WS_EX_CLIENTEDGE, $LVS_EX_DOUBLEBUFFER, $LVS_EX_FULLROWSELECT ) ) $hLV = GUICtrlGetHandle( $idLV ) ; Virtual listview Reduces flicker _GUICtrlListView_AddColumn( $hLV, "Items", 250 ) ; Handle $WM_NOTIFY messages from ListView ; Necessary to display the rows in a virtual ListView GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" ) ; Show GUI GUISetState( @SW_SHOW ) ; Fill array FillArray( $aItems, $iItems ) _ArraySort( $aItems, 0, 0, 0, 0, 1 ) ; Set search array to include all items For $i = 0 To $iItems - 1 $aSearch[$i] = $i Next $iSearch = $iItems ; Display items GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iSearch, 0 ) ; Message loop While 1 Switch GUIGetMsg() Case $idEditSearch Local $sSearch = GUICtrlRead( $idEdit ) If $sSearch = "" Then ; Empty search string, display all rows For $i = 0 To $iItems - 1 $aSearch[$i] = $i Next $iSearch = $iItems Else ; Find rows matching the search string $iSearch = 0 For $i = 0 To $iItems - 1 ;If StringInStr( $aItems[$i], $sSearch ) Then ; Normal search If StringRegExp( $aItems[$i], $sSearch ) Then ; Reg. exp. search $aSearch[$iSearch] = $i $iSearch += 1 EndIf Next EndIf GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iSearch, 0 ) ConsoleWrite( StringFormat( "%4d", $iSearch ) & " rows matching """ & $sSearch & """" & @CRLF ) Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete() EndFunc Func FillArray( ByRef $aItems, $iRows ) Local $aLetters[26] = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', _ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' ] Local $s For $i = 0 To $iRows - 1 $s = $aLetters[Random(0,25,1)] For $j = 1 To Random(10,30,1) $s &= $aLetters[Random(0,25,1)] Next $aItems[$i] = $s Next EndFunc Func WM_COMMAND( $hWnd, $iMsg, $wParam, $lParam ) Local $hWndFrom = $lParam Local $iCode = BitShift( $wParam, 16 ) ; High word Switch $hWndFrom Case $hEdit Switch $iCode Case $EN_CHANGE GUICtrlSendToDummy( $idEditSearch ) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam ) Local Static $tText = DllStructCreate( "wchar[50]" ) Local Static $pText = DllStructGetPtr( $tText ) Local $tNMHDR, $hWndFrom, $iCode,$tInfo $tNMHDR = DllStructCreate( $tagNMHDR, $lParam ) $hWndFrom = HWnd( DllStructGetData( DllStructCreate( $tagNMHDR, $lParam ), "hWndFrom" ) ) $iCode = DllStructGetData( $tNMHDR, "Code" ) Switch $hWndFrom Case $hLV Switch $iCode Case $LVN_GETDISPINFOW Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam ) If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then Local $sItem = $aItems[$aSearch[DllStructGetData($tNMLVDISPINFO,"Item")]] DllStructSetData( $tText, 1, $sItem ) DllStructSetData( $tNMLVDISPINFO, "Text", $pText ) DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) ) EndIf Case $LVN_ITEMCHANGED $tNMHDR = DllStructCreate("hwnd;uint;uint;int iItem;int;uint iNewState;uint;uint;long;long;lparam", $lparam) If BitAND(DllStructGetData($tNMHDR, "iNewState"), $LVIS_SELECTED) Then Local $tNMLISTVIEW = DllStructCreate( $tagNMLISTVIEW, $lParam ) $iSelItem = DllStructGetData( $tNMLISTVIEW, "Item" ) MsgBox(0,$iSelItem,_GUICtrlListView_GetItemText($hLV,$iSelItem)) MsgBox(0,$iSelItem,_GUICtrlListView_GetItemText($hLV,$iSelItem)) EndIf EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc Edited November 14, 2019 by banged Link to comment Share on other sites More sharing options...
LarsJ Posted November 16, 2019 Author Share Posted November 16, 2019 Iczer, I don't think your functionality can be coded using LVN_ODFINDITEM notifications. It's much easier to use an input control or similar. powerofos 1. Use this line at the bottom of the code: _WinAPI_DrawText( $hDC, $aResult[$iItem-$iFrom+1][$iSubItem], $tRect, $DT_WORD_ELLIPSIS ) ; Draw text 3. In the NM_CLICK code, you can extract item (=index) and subitem from the tagNMITEMACTIVATE structure. Then you can read data from $aResult as in the code line above. 2. Since you have already determined both item and subitem in the NM_CLICK code, you do not need any subclassing code. banged, In a virtual listview, data isn't stored in items/subitems. Data is only stored in the data source. Therefore, _GUICtrlListView_GetItemText doesn't work. Read data directly from the source as you do in the LVN_GETDISPINFOW code. banged 1 Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
VAN0 Posted June 9, 2020 Share Posted June 9, 2020 (edited) What a difference this method vs standard. It even can handle tens individual insertions a second. A bit visually not pleasant, but at least it's responsive. I have dynamic list array it's being populated via SHELLHOOK event and could change several times a second, what's the best way prevent it from flickering and how to automatically scroll it to the last item? [EDIT] So far I'm using this method: ;disable screen update GUICtrlSendMsg( $gListview, $WM_SETREDRAW, False, 0) ;scroll to the last item GUICtrlSendMsg( $gListview, $LVM_SETITEMCOUNT, Ubound($list)-1, $LVSICF_NOSCROLL + $LVSICF_NOINVALIDATEALL) ;enable screen update GUICtrlSendMsg( $gListview, $WM_SETREDRAW, True, 0) Works decent, still scroll kind of distorted. Edited June 9, 2020 by VAN0 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