Page 1 sur 1

[..] 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