Page 1 sur 1

[..] Modifier la couleur d'un item dans une listview

Posté : mar. 14 avr. 2009 17:15
par val25
Bonjour,

Existe-t-il un moyen de modifier la couleur d'un item d'une listview lorsque celle-ci est déjà remplie ?
En effectuant des recherches sur le forum, j'ai trouvé des exemples de code pour modifier la couleur du texte d'un item au moment où il est inséré dans la liste, mais après coup je ne trouve pas.
Faut-il retirer l'item et le remettre en modifiant sa couleur ?
(a priori ça me semble un peu lourd comme méthode)

Voici le contexte :
Les items de la listview sont des adresses IP de stations.
Le script effectue des opérations sur chaque station sélectionnée dans la liste.
Quand l'opération se termine sur une station, je souhaite changer la couleur de l'item selon le résultat de l'action. Exemple texte rouge si erreur, texte vert si OK.

Voila, merci d'avance...
Val

Re: Modifier la couleur d'un item dans une listview déjà remplie

Posté : mar. 14 avr. 2009 19:03
par GaRydelaMer
Bonjour

je sais pas si c'est possible.

Une autre idée qui est surement plus simple. Tu change l'image de l'item.

Tu créer autant d'icônes que tu veux, pour chaque état.
1 en attente
2 ok
3 erreur

Une autre idée, tu utilises les groupes
1 groupe Fais sans erreur
1 groupe Fais avec erreur

Bien sur tu peux faire les 2, Icônes plus groupes.

_GUICtrlListView_SetItemImage() pour changer l'image

_GUICtrlListView_EnableGroupView() pour activer la vue par groupe
_GUICtrlListView_InsertGroup() pour créer les groupes dans la LV
_GUICtrlListView_SetItemGroupID() pour affecter un item dans un groupe

Re: [..] Modifier la couleur d'un item dans une listview

Posté : mar. 14 avr. 2009 20:42
par Tlem
@val25

Merci de prendre le temps de lire les règles de présentation d'un message.

Re: [..] Modifier la couleur d'un item dans une listview

Posté : mer. 15 avr. 2009 03:34
par orax
Pour changer la couleur de fond j'utilise (ça marche aussi quand c'est déjà rempli) :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
$a_listViewItems[$i] = GUICtrlCreateListViewItem(..., $idListView)
GUICtrlSetBkColor($a_listViewItems[$i], $GUI_BKCOLOR_TRANSPARENT) ; fond transparent
GUICtrlSetBkColor($a_listViewItems[$i], 0xff0000) ; fond rouge
 
mais j'ai vu qu'il y a d'autres fonctions dans le même genre dans les _GUICtrlListView_...

Re: [..] Modifier la couleur d'un item dans une listview

Posté : jeu. 23 avr. 2009 16:25
par val25
Merci à tous ceux qui m'ont répondu.
Je suis revenu à d'autre tâches, mais je garde vos propositions sous le coude.
J'ajouterai des commentaires dès que possible pour clôturer le fil.
A bientôt

Re: [..] Modifier la couleur d'un item dans une listview

Posté : jeu. 30 mai 2013 16:45
par tatane
Bonjour,

Désolé de déterrer ce sujet mais j'ai exactement le même soucis.

Je suis allé du côté de WM_NOTIFY et $NM_CUSTOMDRAW mais impossible de modifier la couleur d'un item de la listview en cliquant dessus par exemple.

Est-ce qu'une solution a été trouvé depuis la création de ce sujet ?

Re: [..] Modifier la couleur d'un item dans une listview

Posté : jeu. 30 mai 2013 19:17
par mikell
WM_NOTIFY est la bonne piste, voilà un exemple avec dble-clic (adaptable)
► Afficher le texte

Re: [..] Modifier la couleur d'un item dans une listview

Posté : jeu. 30 mai 2013 21:11
par tatane
Merci beaucoup pour cet exemple.
Malheureusement j'utilise _GUICtrlListView_AddItem et _GUICtrlListView_AddSubItem pour compléter ou mettre à jour la listview et je vois dans votre code que vous récupérez les controlID des items en retour de GUICtrlCreateListViewItem. Ce qui vous permet ensuite de colorer le texte avec GuiCtrlSetColor.

Y a-t-il un moyen pour récupérer les controlID de mes items ?


Edit : Au départ, faute de pouvoir utiliser GuiCtrlSetColor, j'étais parti sur la structure $tagNMCUSTOMDRAW qui permet de modifier les couleurs des items ("clrText" et "clrTextBk") mais je n'ai pas réussi à gérer les messages issus de NM_CUSTOMDRAW.

Re: [..] Modifier la couleur d'un item dans une listview

Posté : ven. 31 mai 2013 22:12
par mikell
tatane a écrit :Y a-t-il un moyen pour récupérer les controlID de mes items ?
Non
Mais une gestion de listview peut très bien être faite par GUICtrlCreateListViewItem + GuiCtrlSetData, est-il vraiment nécessaire d'utiliser _GUICtrlListView_AddItem & Co qui ne sont pas du tout pratiques ?

Re: [..] Modifier la couleur d'un item dans une listview

Posté : sam. 01 juin 2013 09:12
par tatane
Et bien cela dépend si l'on peut ajouter des icônes/images où l'on souhaite avec la fonction Listview native.
De ce que j'ai pu lire, on peut en ajouter en première colonne via GuiCtrlSetimage mais pas ailleurs ?

Re: [..] Modifier la couleur d'un item dans une listview

Posté : sam. 01 juin 2013 11:58
par mikell
Ah mais non
► Afficher le texte
AMHA l'important c'est qu'avec GUICtrlCreateListViewItem tu identifies les items (ID, handle, index) alors qu'avec l'autre machin tu n'as que leurs index ... ce qui te fait une belle jambe si la listview doit évoluer ^^
Après si tu veux gérer la couleur de texte par subitem là en revanche tu peux pas échapper aux joies de NM_CUSTOMDRAW (même si avoir les ids des items peut faciliter la tâche)

Re: [..] Modifier la couleur d'un item dans une listview

Posté : sam. 01 juin 2013 18:26
par tatane
Je suis d'accord avec vous, ne récupérer que l'index des items est assez pénible.
En fait je pensais que pour ajouter un subitem par la fonction UDF il fallait au préalable avoir créer l'item avec _GUICtrlListView_AddItem. Des fois je me mettrais des claques...

Voici le bout de code permettant de modifier la couleur de l'item souhaité. Par contre je ne sais pas comment modifier la couleur d'un subitem sans modifier toute la ligne :

Code : Tout sélectionner

        Case $hWndListViewPC
            Switch $iCode
                Case $NM_CUSTOMDRAW ; afin de changer la couleur ou la police du texte des items de la listview
                    If Not _GUICtrlListView_GetViewDetails($hWndFrom) Then Return $GUI_RUNDEFMSG

                    Local $iDrawStage, $tCustDraw
                    $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
                    $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage')
                    $iIndex = DllStructGetData($tCustDraw, 'dwItemSpec')

                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW

                    If $iDrawStage = $CDDS_ITEMPREPAINT Then
                        If $tab_stock_couleur[$iIndex] <> "" Then ; tableau stockant des couleurs prédéfinies
                            DllStructSetData($tCustDraw, 'clrText', RGB2BGR($tab_stock_couleur[$iIndex]))
                        EndIf
                        Return $CDRF_NOTIFYSUBITEMDRAW
                    EndIf
            EndSwitch

Re: [..] Modifier la couleur d'un item dans une listview

Posté : sam. 01 juin 2013 22:41
par mikell
Bon j'ai quelque chose là
On check l'item et le subitem avec le NM_CLICK avant de l'exploiter dans le NM_CUSTOMDRAW
Par facilité parce que j'avais déjà un bout de script ici j'utilise _GUICtrlListView_Create
► Afficher le texte
Edit
... mais ça marche aussi avec GuiCtrlCreateListview Image
► Afficher le texte

Re: [..] Modifier la couleur d'un item dans une listview

Posté : dim. 02 juin 2013 09:30
par tatane
En un mot : Génial :)

Par contre je ne comprends pas comment seul le subitem peut changer de couleur ?
La fonction utilisée est toujours la même "DllStructSetData($tCustDraw, "clrText", $iColor)" et on ne précise pas spécialement l'index du subitem ?
Pourquoi ne repaint-il pas toute la ligne ?
De plus vous utilisez $CDRF_NEWFONT comme retour de message, est-ce une obligation ?

Désolé de vous embêter encore mais pouvez-vous m'expliquer en détails le fonctionnement de ce fichu $NM_CUSTOMDRAW ?

Merci par avance.

Re: [..] Modifier la couleur d'un item dans une listview

Posté : dim. 02 juin 2013 14:34
par mikell
En fait dans NM_CUSTOMDRAW les notifications sont retournées par étapes, c'est le fait d'avoir retourné CDRF_NOTIFYSUBITEMDRAW à l'étape précédente qui autorise l'action sur les subitems
Et c'est à l'étape suivante qu'on précise l'index du subitem à modifier (le $click_subitem récupéré au NM_CLICK), tu peux le vérifier en modifiant juste cette ligne

Code : Tout sélectionner

If $iItem = $click_item Then [color=#dd0000];;; and $iSubItem = $click_subitem Then[/color]
où là effectivement toute la ligne est repeinte, mais d'une couleur différente selon le subitem cliqué :wink:
Quand on a assimilé le concept de fonctionnement, les possibilités deviennent variées
Par exemple pour que l'item garde sa nouvelle couleur il suffit de commenter cette ligne dans le NM_CLICK

Code : Tout sélectionner

; If $click_item<>-1 Then _GUICtrlListView_SetTextColor($listview, 0)
Je renvoie CDRF_NEWFONT pour notifier les modifications mais CDRF_NOTIFYSUBITEMDRAW marche aussi
Pour le fonctionnement en détail voir ici :
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
(surtout en bas de la page) où pour une fois MS explique les choses clairement :roll: :mrgreen:

Re: [..] Modifier la couleur d'un item dans une listview

Posté : lun. 03 juin 2013 09:17
par tatane
Merci beaucoup pour toutes ces précisions.
En effet msdn est assez velu et souvent manque de liens d'explications...
En tout cas grâce à vous je vais pouvoir désormais m'amuser avec Custom Draw.

Re: [..] Modifier la couleur d'un item dans une listview

Posté : lun. 03 juin 2013 15:29
par mikell
Oui, par exemple : dans la mesure où on colore les (sub)items sélectionnés, on peut alors avoir envie de se débarrasser de la pollution visuelle que représente le 'highlight' au clic
► Afficher le texte
:mrgreen:

Re: [..] Modifier la couleur d'un item dans une listview

Posté : mar. 04 juin 2013 12:56
par tatane
Tiens d'ailleurs en parlant de sélection, est-il possible de changer la couleur du highlight de cette façon ?
Il me semble avoir lu que cela dépendait du thème de Windows et que le seul moyen était de repeindre par dessus via les fonctions _GDIPlus (texte et fond) ?