[R] Modifier la couleur d'une ligne dans une ListView

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Modifier la couleur d'une ligne dans une ListView

#1

Message 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
Modifié en dernier par jpascal le lun. 03 juil. 2023 11:11, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#2

Message par jguinch »

Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#3

Message 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
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#4

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#5

Message 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. 😞
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#6

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#7

Message 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().

:(
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#8

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Modifier la couleur d'une ligne dans une ListView

#9

Message 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.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre