Header d'une listview [Résolu]

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
Bonjour je cherche comment changer le headers d une list view (
couleurs ou fond ) j'ai trouvé ces fonctions la mais ca m'avance pas
beaucoup si vous auriez des exemples SANS MFC je suis prenneur aussi.



ListView_SetExtendedListViewStyleEx(hwndLV, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);

HWND hLVHeader = ListView_GetHeader(hwndLV); // header de la ListView



lvc.mask = LVCF_TEXT | LVCF_WIDTH;

lvc.cx = 40;



lvc.pszText = "col1";

ListView_InsertColumn(hwndLV, 0, &lvc);



lvc.pszText = "col2";

ListView_InsertColumn(hwndLV, 1, &lvc);



lvc.pszText = "col3";

ListView_InsertColumn(hwndLV, 2, &lvc);



HDITEM h;

Header_GetItem(hLVHeader,0,&h);

h.mask |= HDI_BITMAP;

h.hbm = (HBITMAP)LoadImage(0,"c:\\test.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

Header_SetItem(hLVHeader,0,&h);

h.pszText="test";

8 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
En fait c'est plus compliqué, pour afficher le bitmap au lieu de la chaine dans le header, il faut passer le flag HDF_BITMAP dans le champ fmt de la structure HDITEM.
Puisque les champ fmt et hbm doivent etre valides, il faut mettre HDI_BITMAP | HDI_FORMAT dans le champ mask de la structure.

Et ca devrait aller..
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
h.mask |= HDI_BITMAP;
h.mask n'est pas initialisé avant ca, faudrait pas plutot mettre h.mask = HDI_BITMAP ?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Nickel c exactement ca !!

Me reste a regler les bordures mais je l'ai vu dans la msdn !!

Par contre si je veux juste changer la couleur ya une commande speciale ou je peux faire avec LVM_SETTEXTCOLOR
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Si tu parles de la couleur des items, c'est bien avec LVM_SETTEXTCOLOR qu'on la change.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait c'etait celle des headers que je cherche a changer et cette
commande ne marche pas je viens de tester j'ai bien vu que j'ai ce style

* : HDF_OWNERDRAWThe header control's owner draws the item.

Mais je me vois pas partir sur les ownerdraw, a la rigueur custom draw
mais la j'ai pas trouvé d exmple pour changer la couleur du fond ou
mettre une icone.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Pour la couleur des headers, ca a pas l'air d'etre implementé, donc effectivement il faut se tourner vers l'ownerdraw.
Lorsqu'un control est en ownerdraw, la fenetre parent recoit un message WM_DRAWITEM qui contient tout les infos du control a redessiner, c'est en traitant ce message que tu pourra changer l'apparence de tes headers.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

C bon j'ai trouvé plus simple il me suffit de sous classer le header et
de traiter le message on_paint par contre je me suis fait cette
commande pour rajouter des colonnes et je trouve bizarre d avoir a
mettre le nom de ma colonne a la fois dans le LVCOLUMN (sinon ca na s
affiche pas) et le HDITEM (vu que c'est grace a lui que je trouve mes
noms quand je redessine)



void Addcol(HWND hwndLV,HWND hLVHeader, char *text,int taille) {



LVCOLUMN lvc;

lvc.mask = LVCF_TEXT | LVCF_WIDTH;

lvc.cx = taille;

lvc.pszText = text;

ListView_InsertColumn(hwndLV, 1, &lvc);



HDITEM h;

h.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER;

h.mask=12;

h.cchTextMax = 255;

Header_GetItem(hLVHeader,1,&h);

// h.mask |=HDI_TEXT;

h.pszText=text;

h.cchTextMax=strlen(text);

Header_SetItem(hLVHeader,1,&h);



}




Si tu pouvais me dire la difference entre lvc.pszText et
h.pszText ???
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
lvc.pszText c'est le nom de la colone et h.pszText c'est le nom de l'item associé a la colone dans le header.
Le controle listview utilise le controle header, donc quand tu changes le texte d'une colone, le texte de l'item du header est automatiquement mis a jour (je pense).