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_RUNDEFMSG
EndFunc   ;==>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 ! :-D
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 = 0
Global $idListview = 0
Global $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   ;==>Example

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) ; 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_RUNDEFMSG
EndFunc   ;==>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 :mrgreen: juste 2 lignes à enlever
Mais tu peux oublier toutes ces fonctions ItemParam qui alourdissent ton script et n'y servent à rien

; Changement de couleur
   Local $sType = _GUICtrlListView_GetItemText($hListView, $iItem)
   Local $sValue = _GUICtrlListView_GetItemText($hListView, $iItem, $iSubItem)
   If StringRegExp($sType, 'Canard|Poulet') Then
      ; valeurs trouvables dans la première colonne > coloration de toute la ligne
      DllStructSetData($tCustDraw, "clrText", 0x00ff00)
   ElseIf StringRegExp($sValue, 'Toto|Titi') Then
      ; valeurs trouvables dans la seconde colonne > coloration du texte de la cellule :-(
      DllStructSetData($tCustDraw, "clrText", $CLR_RED)
  EndIf
  Return $CDRF_NEWFONT

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)
Next

Do
   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)
Next

Do
   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.