Listview à plusieurs colonnes et images [Résolu]

Signaler
Messages postés
4
Date d'inscription
dimanche 16 janvier 2005
Statut
Membre
Dernière intervention
18 mai 2008
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Salut,

Je suis actuellement en train de porter une appli de CVI/Labwindows sur VS 2008, et je bloque sur la listview de mon application.

J'ai vu plusieurs sources permettant d'ajouter du texte dans plusieurs colonnes( http://www.cppfrance.com/codes/TRI-COLONNES-LISTVIEW-WIN32_24239.aspx ), mettre des images dans une liste simple(http://chgi.developpez.com/windows/listview/) mais je n'en ai pas vu avec les 2 :/

J'ai plusieurs questions :
- Est t'on obligé de passer par l'évenement "LVN_GETDISPINFO" pour afficher du texte dans la liste, ne peux t'on pas le faire plus simplement? Changer unitairement les cellules"

- Mon anglais s'est un peu rouillé est j'ai un peu de mal à comprendre le rôle précis de chacuns des membres des structures LVITEM et LVCOLUMN, quelqu'un aurai t'il un lien vers un tuto?

merci d'avance :)

11 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
subitem tu peux le mettre à 0 je pense, pour ma part je ne me souviens pas avoir eu à l'utilier.
item = index de la ligne dont il est question

Pour ton code, tu peux pas donner un projet complet? Ca m'évitera d'avoir à tout refaire pour tester

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,
Pour LVN_GETDISPINFO je pense qu'on peut s'en passer. Personnellement je ne m'en sers jamais. Pour changer le texte d'une seule cellule d'une ListView je fais comme ceci:
lvitem.mask = LVIF_TEXT;
lvitem.iItem=0;//premier item
lvitem.iSubItem=2;// cellule N°2
lvitem.pszText="Bonjour";
SendMessage(hlistview,LVM_SETITEMTEXT,0,(LPARAM)&lvitem);
On peut aussi utiliser la macro ListView_SetItemText().
Pour d'autres modifications on peut utiliser le message LVM_SETITEM ou la macro ListView_SetItem().
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je pense que oui, on est obligé d'utiliser le message LVN_GETDISPINFO.
Quels sont les champs que tu ne comprends pas dans les structures LVITEM et LVCOLUMN?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
4
Date d'inscription
dimanche 16 janvier 2005
Statut
Membre
Dernière intervention
18 mai 2008

Merci pour ta réponse.
Pour les structure, j'ai un peu de mal avec les items et subitems.


Sinon au niveau de ma liste, j'arrive à afficher les icones en mode "simple" ( pas de colonnes --> LVSIL_NORMAL) mais quand j'insère les colonnes, les icones n'apparaissent pas ( vide) pourtant j'ai bien mis le LVSIL_STATE à la création de la liste.

J'ai mis ici >http://lemick2.free.fr/liste.txt< le bout de code concerné au cas ou je louperai quelque chose d'important.
Messages postés
4
Date d'inscription
dimanche 16 janvier 2005
Statut
Membre
Dernière intervention
18 mai 2008

Merci pour ta réponse :)

J'ai trouvé la solution à mon problème :
Il faut déclarer la liste d'image avec le style "LVSIL_SMALL" (ListView_SetImageList)
Je trouve pas ca très logique mais l'important est que ca marche.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ben j'aurai appris un truc aujourd'hui. Je n'avais jamais pu comprendre à quoi servait ce subItem...

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Je pense que LVN_GETDISPINFO ne doit être utilisé que si le contenu de la listview est stocké quelque part par l'application. Par défaut, une listview gère elle-même son contenu.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
LVN_GETDISPINFO est effectivement très pratique pour fournir les données seulement quand les lignes sont visibles, ça permet un affichage quasi instantané au lieu d'insérer des milliers (ou plus en cas de grosse table BDD) de lignes dans la listview.

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Pour la vitesse il est également possible d'utiliser une ListView en OWNERDRAWFIXED. Ainsi, on ne dessine qu'une portion de lignes à la fois. La listview aura une taille fixe. Disons une trentaine d'éléments au total par exemple. Le contenu de ces éléments correspondra à une page, parmi plusieurs, d'une trentaine de lignes extraites d'une base de données ou autre. Quelques astuces de programmation et le tour est joué.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je n'ai pas compris l'intérêt d'une liste en OWNERDRAWFIXED plutot que de traiter

LVN_GETDISPINFO. LVN_GETDISPINFO n'étant envoyé que pour les lignes et colonnes à afficher, on fait déja le strict minimum.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
En OWNERDRAWFIXED, l'application se charge de dessiner la partie visible d'une listview. Elle peut chercher quoi afficher là où on veut en dehors du vrai contenu de la listview.