racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 21 févr. 2008 à 19:49
Salut,
Voici globalement comment il faut procéder:
Tu peux utiliser l'ImageList du système. Pas besoin de créer la tienne. Voici comment récupérer son HANDLE:
SHFILEINFO shi;
HIMAGELIST himglist= (HIMAGELIST)SHGetFileInfo(0,0,&shi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
Tu attaches ensuite ce HANDLE à ta ListView:
ListView_SetImageList(hListView,himglist,LVSIL_SMALL);
Maintenant, à chaque fois que tu as besoin d'ajouter un élément à ta ListView, tu récupères l'index de l'icone correspondant à l'extension du fichier en faisant:
SHGetFileInfo(szchemindufichier,0,&shi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
L'index de l'icone se retrouvera dans le membre iIcon de la structure SHFILEINFO.
Tu passeras sa valeur au membre iImage de la structure LVITEM:
LvItem.iImage =shi.iIcon;
Il suffira enfin d'ajouter l'item à ta ListView:
ListView_InsertItem(hListView,&LvItem);
Pour les fichiers EXE, il faudra extraire l'icone depuis l'exécutable en utilisant ExtractIcon() par exemple.
Voilà j'espère n'avoir rien omis.
<link href="css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 févr. 2008 à 09:33
donc tu souhaites juste ajouter une icone a la listview
ajouter un item associé a cette icone...
là, tu créé une nouvelle imageliste, tu ajoutes l'icone, l'item lié a cette icone.
en gros :
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo(name, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON);
HIMAGELIST himage;
SendMessage(tmplistview,LVM_GETIMAGELIST,LVSIL_SMALL,(LPARAM)himage);
ListView_SetItemText(tmplistview,0,nCol,name); //ajout du texte de l'item dans nCol, nItem
LvItem.stateMask = 0xFFFF;
LvItem.cchTextMax=260;
LvItem.iImage=ImageList_AddIcon(himage,sfi.hIcon);
pourquoi ne pas d'ailleurs, utiliser la msglist système ? si c'est juste pour garder les icones en double, c'est dommage...
Renfield
Admin CodeS-SourceS- MVP Visual Basic
Vous n’avez pas trouvé la réponse que vous recherchez ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 févr. 2008 à 10:03
il faut en créer UNE imageliste, la première fois, c'est tout...
ensuite, simplement se contenter d'y ajouter tes icones...
toi, tu recréé actuellement une nouvelle imagelist a chaque fichier, mais la listview n'en accepte qu'une a la fois, par format d'affichage.... du coup, tu perds tes anciennes icones
akalys
Messages postés31Date d'inscriptionmercredi 6 février 2008StatutMembreDernière intervention 6 janvier 2010 22 févr. 2008 à 15:06
Il me reste un petit soucis.
Comment détruit ton ou vide on une image liste svp.
Car j'ai un soucis et lorsque je passe d'une fonction a l'autre se servant chacune d'une listview avec icone il y a soucis.
Les imagelist ne s'initialise pas comme il faut et sa bug
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 22 févr. 2008 à 20:52
Sous Windows NT, 2000 et XP, l' ImageList récupérée avec SHGetFileInfo() n'est qu'une copie de celle du système. Elle se remplit au fur et à mesure des appels suivants de SHGetFileInfo() pour récupérer les index. Elle n'est donc valable que pour l'application en cours. Elle est automatiquement détruite après desctruction du contrôle auquel elle est associée.
Il existe une autre méthode pour récupérer l'ImageList du système contenant tous les icones. Elle utilise des fonctions non documentées de shell32.dll.