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

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
val25
Niveau 2
Niveau 2
Messages : 16
Enregistré le : lun. 16 juin 2008 16:33
Status : Hors ligne

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

#1

Message 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
Modifié en dernier par Tlem le mar. 14 avr. 2009 20:41, modifié 1 fois.
Raison : Ajout balise de titre
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

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

#2

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#3

Message par Tlem »

@val25

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

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#4

Message 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_...
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
val25
Niveau 2
Niveau 2
Messages : 16
Enregistré le : lun. 16 juin 2008 16:33
Status : Hors ligne

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

#5

Message 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
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#6

Message 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 ?
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'un item dans une listview

#7

Message par mikell »

WM_NOTIFY est la bonne piste, voilà un exemple avec dble-clic (adaptable)
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#8

Message 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.
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'un item dans une listview

#9

Message 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 ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#10

Message 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 ?
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'un item dans une listview

#11

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#12

Message 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
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'un item dans une listview

#13

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#14

Message 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.
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'un item dans une listview

#15

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#16

Message 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.
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'un item dans une listview

#17

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

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

#18

Message 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) ?
Répondre