Pb ListView et image dans le subitem en C

salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018 - 13 sept. 2014 à 20:34
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 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

3 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
13 nov. 2014 à 19:22
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.

--
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
18 nov. 2014 à 22:31
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...
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
Modifié par ToutEnMasm le 19/11/2014 à 17:24
--
0
Rejoignez-nous