Pb ListView et image dans le subitem en C

Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
- - Dernière réponse : ToutEnMasm
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
- 19 nov. 2014 à 17:21
Bonjour,
(en C sous CodeBlocks, pas de MFC, pas de Visual C++...)
je galère depuis hier pour insérer une icône dans un subitem d'une listview. Après moultes recherches sur internet, je pense avoir trouvé tout ce qu'il faut, mais aucune image ne s'affiche. Et je n'arrive pas à trouver un exemple complet que je pourrais décortiquer. Si quelqu'un peut m'en dénicher un, ou bien me dire où je me trompe, je lui en serais bien reconnaissant.

case WM_CREATE:
{
HIMAGELIST hListIcon = 0;
hListIcon = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_MASK, 0, 1);
// retour != NULL
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_COPY));
// retour != NULL
r = ImageList_AddIcon(hListIcon, hIcon);
// retour != -1
hListView = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT,
20, 50, 750, 400, hWnd, NULL, hInstance, NULL);
ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES | LVS_REPORT);
HIMAGELIST p = ListView_SetImageList(hListView, hListIcon, LVSIL_NORMAL);
// retour NULL car c'est la première affectation, c'est normal
LVCOLUMN lvc = { LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT };
lvc.fmt = LVCFMT_LEFT;
for (i = 0; i < 2; i ++)
{
lvc.cx = 100;
lvc.pszText = (PCHAR)TEXT("A");
ListView_InsertColumn(hListView, i, &lvc);
}
LVITEM lvi = { LVIF_TEXT | LVIF_IMAGE };
for (i = 0; i < 2; i ++)
{
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = (PCHAR)TEXT("Exemple");
lvi.iImage = r;
ListView_InsertItem(hListView, &lvi);
for (j = 0; j < 2; j ++)
{
lvi.iItem = i;
lvi.iSubItem = j;
lvi.pszText = (PCHAR)TEXT("Remplace");
lvi.iImage = r;
ListView_SetItem(hListView, &lvi);
}
}
break;
}

Jean-Claude
Afficher la suite 

3 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
Salut,

Je pense que tu devrais ajouter le style LVS_OWNERDRAWFIXED et utiliser la fonction DrawIcon() dans ta fonction de dessin de la listview. Ainsi tu pourras afficher l'icone dans le subitem ou les subitems que tu veux. Ta fonction sera appelée en réponse au message WM_NOTIFY chaque fois que ta listview a besoin d'être redessinée. Voir la MSDN pour plus de détails. Grâce à Google, tu trouveras des exemples en tapant LVS_OWNERDRAWFIXED.

--
Commenter la réponse de racpp
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

Ton problème est surement du à la résolution de l'image (bits par pixel) non supportée,
sinon, y'a plus simple, (sans ownerDraw et sans loadIcon)
Utiliser ImageList_LoadImage() qui contient dans ses parametres la taille d'une image dans la liste d'images qu'il charge lui-même
Suffit ensuite de faire un SendMsg LVM_SETIMAGELIST
Puis d'utiliser le iImage de LVITEM qui est l'indice de l'image qu'on veut afficher.
On peut aussi coupler avec une fonction CustomDraw pour la couleur des items, la fonte, ect...

Pour ListView en mode Rapport:

HIMAGELIST hImgList = ImageList_LoadImage( ...,CXtailleImg,...
SendMessage(hWndList, LVM_SETIMAGELIST, LVSIL_SMALL, ...

LVCOLUMN listCol;
//ect...

LVITEM listItem;
listItem.mask = LVIF_IMAGE;
listItem.iItem = line;
listItem.iSubItem = column;
listItem.iImage = nIndexImage; // base 0

SendMessage(hWndList, column ? LVM_SETITEM : LVM_INSERTITEM, 0, (LPARAM)&listItem);

Exemple complet ici, voir ListViewManage.cpp
(c'est une classe (wrapper) mais le code est du Win32)

http://codes-sources.commentcamarche.net/source/view/41907/1094968

bye...
Commenter la réponse de yann_lo_san
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
0
Merci
--
Commenter la réponse de ToutEnMasm