Page 1 sur 1
[R] Modifier la couleur d'une ligne dans une ListView
Posté : jeu. 17 sept. 2020 19:58
par jpascal
Bonjour,
Ce type de question a été posée de nombreuses fois et des réponses ont été apportées.
Je n'arrive malheureusement pas à résoudre mon problème.
Si l'on désire changer la couleur d'une ligne, il suffit d'utiliser GUICtrlCreateListViewItem() puis GUICtrlSetColor().
Or j'utilise _GUICtrlListView_AddItem() car j'ai besoin de _GUICtrlListView_SetItemGroupID().
Dans ce cas je peux utiliser une fonction WM_NOTIFY() avec $NM_CUSTOMDRAW.
Mais DllStructSetData($tCustDraw, "clrText", $CLR_XXXX) ne change que la couleur de l'item ou du sous-item.
Je suis donc bloqué.
Merci d'avance pour votre aide.
Voici le code de la fonction WM_NOTIFY()
Func WM_NOTIFY
($hWnd, $Msg, $wParam, $lParam) Local $tNMHDR, $hWndFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage") Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem") Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec") If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW If $iDrawStage = $CDDS_ITEMPREPAINT Then ControlListView($hGUI, "", $idListview, "DeSelect", $iItem) _GUICtrlListView_SetItemFocused($hListView, $iItem, False) Return $CDRF_NOTIFYSUBITEMDRAW EndIf ; Changement de couleur Local $sType = _GUICtrlListView_GetItemText($hListView, $iItem) Local $sValue = _GUICtrlListView_GetItemText($hListView, $iItem, $iSubItem) If StringRegExp($sType, 'Canard|Poulet', $STR_REGEXPMATCH) Then DllStructSetData($tCustDraw, "clrText", $CLR_OLIVE) ElseIf StringRegExp($sValue, 'Toto|Titi', $STR_REGEXPMATCH) Then DllStructSetData($tCustDraw, "clrText", $CLR_RED) ; JE VOUDRAIS COLORISER TOUTE LA LIGNE EndIf Return $CDRF_NEWFONT EndSwitch EndSwitch Return $GUI_RUNDEFMSGEndFunc ;==>WM_NOTIFY
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : jeu. 17 sept. 2020 21:06
par jguinch
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : ven. 05 mai 2023 16:45
par jpascal
Bonjour,
Comme on dit, mieux vaut tard que jamais !
Je reviens vers vous car je tente à nouveau de solutionner mon problème sans succès.
J'ai utilisé les fonctions _GUICtrlListView_SetItemParam() et _GUICtrlListView_GetItemParam()
Voici le code permettant de tester :
#include <ColorConstants.au3>#include <ListViewConstants.au3>#include <GUIConstantsEx.au3>#include <GuiImageList.au3>#include <GuiListView.au3>#include <WindowsConstants.au3>Global $hGUI = 0, $hListView = 0Global $idListview = 0Global $g_aParam[0]Main
()Func Main
() Local $iIndex = 0 GUICreate("ListView", 400, 300) $idListview = GUICtrlCreateListView("", 2, 2, 394, 268, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)) $hListView = GUICtrlGetHandle($idListview) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") _GUICtrlListView_InsertColumn($idListview, 0, "Column 1", 100) _GUICtrlListView_InsertColumn($idListview, 1, "Column 2", 100) $iIndex = _GUICtrlListView_AddItem($idListview, "Canard") _GUICtrlListView_SetItemParam($idListview, $iIndex, $iIndex + 1000) _GUICtrlListView_AddSubItem($idListview, $iIndex, "Loulou", 1) $iIndex = _GUICtrlListView_AddItem($idListview, "Coq") _GUICtrlListView_SetItemParam($idListview, $iIndex, $iIndex + 1000) _GUICtrlListView_AddSubItem($idListview, $iIndex, "Toto", 1) $iIndex = _GUICtrlListView_AddItem($idListview, "Poulet") _GUICtrlListView_SetItemParam($idListview, $iIndex, $iIndex + 1000) _GUICtrlListView_AddSubItem($idListview, $iIndex, "Fifi", 1) $iIndex = _GUICtrlListView_AddItem($idListview, "Tortue") _GUICtrlListView_SetItemParam($idListview, $iIndex, $iIndex + 1000) _GUICtrlListView_AddSubItem($idListview, $iIndex, "Sophie", 1) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete()EndFunc ;==>ExampleFunc WM_NOTIFY
($hWnd, $Msg, $wParam, $lParam) Local $tNMHDR, $hWndFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage") Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem") Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec") If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW If $iDrawStage = $CDDS_ITEMPREPAINT Then ControlListView($hGUI, "", $idListview, "DeSelect", $iItem) _GUICtrlListView_SetItemFocused($hListView, $iItem, False) Return $CDRF_NOTIFYSUBITEMDRAW EndIf ; Changement de couleur Local $sType = _GUICtrlListView_GetItemText($hListView, $iItem) Local $sValue = _GUICtrlListView_GetItemText($hListView, $iItem, $iSubItem) If StringRegExp($sType, 'Canard|Poulet', $STR_REGEXPMATCH) Then DllStructSetData($tCustDraw, "clrText", $CLR_OLIVE) ; valeurs trouvables dans la première colonne > coloration de toute la ligne ElseIf StringRegExp($sValue, 'Toto|Titi', $STR_REGEXPMATCH) Then DllStructSetData($tCustDraw, "clrText", $CLR_RED) ; valeurs trouvables dans la seconde colonne > coloration du texte de la cellule :-( Local $iParam = _GUICtrlListView_GetItemParam($hListView, $iItem) GUICtrlSetColor($iParam, $CLR_BLUE) EndIf Return $CDRF_NEWFONT EndSwitch EndSwitch Return $GUI_RUNDEFMSGEndFunc ;==>WM_NOTIFY
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : sam. 06 mai 2023 10:36
par mikell
C'était pas loin
juste 2 lignes à enlever
Mais tu peux oublier toutes ces fonctions ItemParam qui alourdissent ton script et n'y servent à rien
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : mer. 21 juin 2023 10:03
par jpascal
C'eut été trop simple.
Le but est de colorer TOUTE la ligne selon qu'une valeur est trouvée dans la première ou seconde colonne.
Or dans le cas où la valeur est trouvée dans la seconde colonne, seule la cellule de cette colonne est colorée.
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : jeu. 22 juin 2023 09:38
par mikell
OK alors pourquoi ne pas aller au plus simple ?
(ce qui n'empêche pas d'utiliser WM_NOTIFY après si besoin)
#include <GUIConstantsEx.au3>#include <GuiListView.au3>Local $item[4]GUICreate("ListView", 400, 300)$idListview = GUICtrlCreateListView(" | ", 2, 2, 394, 268)_GUICtrlListView_SetColumnWidth($idListview, 0, 100)$item[0] = GUICtrlCreateListViewItem ("Canard|Loulou", $idListview)$item[1] = GUICtrlCreateListViewItem ("Coq|Toto", $idListview)$item[2] = GUICtrlCreateListViewItem ("Poulet|Fifi", $idListview)$item[3] = GUICtrlCreateListViewItem ("Tortue|Sophie", $idListview)GUISetState(@SW_SHOW)For $i = 0 to 3 $txt = GUICtrlRead($item[$i]) If StringRegExp($txt, 'Canard|Poulet') Then GuiCtrlSetColor($item[$i], 0x00ff00) If StringRegExp($txt, 'Toto|Titi') Then GuiCtrlSetColor($item[$i], 0xff0000)NextDo Sleep(10)Until GUIGetMsg() = $GUI_EVENT_CLOSE
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : mer. 28 juin 2023 12:24
par jpascal
Bonjour mikell.
Comme indiqué dans le message initial :
Si l'on désire changer la couleur d'une ligne, il suffit d'utiliser GUICtrlCreateListViewItem() puis GUICtrlSetColor().
Or j'utilise _GUICtrlListView_AddItem() car j'ai besoin de _GUICtrlListView_SetItemGroupID().
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : jeu. 29 juin 2023 09:36
par mikell
Pas de problème
#include <GUIConstantsEx.au3>#include <GuiListView.au3>Local $item[4]GUICreate("ListView", 400, 300)$idListview = GUICtrlCreateListView(" | ", 2, 2, 394, 268)_GUICtrlListView_SetColumnWidth($idListview, 0, 100)$item[0] = GUICtrlCreateListViewItem ("Canard|Loulou", $idListview)$item[1] = GUICtrlCreateListViewItem ("Coq|Toto", $idListview)$item[2] = GUICtrlCreateListViewItem ("Poulet|Fifi", $idListview)$item[3] = GUICtrlCreateListViewItem ("Tortue|Sophie", $idListview)GUISetState(@SW_SHOW)_GUICtrlListView_EnableGroupView($idListview)_GUICtrlListView_InsertGroup($idListview, -1, 1, "Group 1")_GUICtrlListView_InsertGroup($idListview, -1, 2, "Group 2")_GUICtrlListView_SetItemGroupID($idListview, 0, 1)_GUICtrlListView_SetItemGroupID($idListview, 1, 1)_GUICtrlListView_SetItemGroupID($idListview, 2, 2)_GUICtrlListView_SetItemGroupID($idListview, 3, 2)For $i = 0 to 3 $txt = GUICtrlRead($item[$i]) If StringRegExp($txt, 'Canard|Poulet') Then GuiCtrlSetColor($item[$i], 0x00ff00) If StringRegExp($txt, 'Toto|Titi') Then GuiCtrlSetColor($item[$i], 0xff0000)NextDo Sleep(10)Until GUIGetMsg() = $GUI_EVENT_CLOSE
Re: [..] Modifier la couleur d'une ligne dans une ListView
Posté : lun. 03 juil. 2023 11:11
par jpascal
C'est parfait merci.
En fait le code superflu venait du fait qu'à la base le besoin était de coloriser uniquement les cellules d'une colonne.