Icone listview [Résolu]

akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 19 févr. 2008 à 17:47 - Dernière réponse : racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention
- 22 févr. 2008 à 20:52
Bonjour à tous,
J'ai le code suivant

    SHFILEINFO sfi;
    ZeroMemory(&sfi, sizeof(SHFILEINFO));
    SHGetFileInfo(name, FILE_ATTRIBUTE_NORMAL,            &sfi,sizeof(SHFILEINFO),SHGFI_USEFILEATTRIBUTES | SHGFI_ICON);
    HIMAGELIST himage;
    himage=ImageList_Create(16, 16, ILC_COLORDDB | ILC_MASK, 3, 0);
    ListView_SetExtendedListViewStyle(tmplistview, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); //ajouet checkbox dans la listeview
    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);
    SendMessage(tmplistview,LVM_SETIMAGELIST,LVSIL_SMALL,(LPARAM)himage);

J'ai un problème et a chaque fois tout mes icone ce reinitialise avec l'icone de l'item courant.

merci

Vive le rugby XIII
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 21 févr. 2008 à 19:49
3
Merci
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;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="macro" proj="platsdk" name="ListView_InsertItem" pubpath="/platform/commctls/listview/macros/listview_insertitem.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_ListView_InsertItem"></mshelp:keyword><mshelp:keyword index="A" term="_win32_ListView_InsertItem_cpp"></mshelp:keyword><mshelp:toctitle title="ListView_InsertItem Macro"></mshelp:toctitle><mshelp:rltitle title="ListView_InsertItem Macro ()"></mshelp:rltitle><mshelp:keyword index="F" term="ListView_InsertItem"></mshelp:keyword><mshelp:keyword index="K" term="ListView_InsertItem"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="Controls"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbControls"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="ListView_InsertItem"></mshelp:attr><mshelp:attr name="APIType" value="HeaderDef"></mshelp:attr><mshelp:attr name="APILocation" value="commctrl.h"></mshelp:attr><mshelp:attr name="TopicType" value="macro"></mshelp:attr></xml>

Merci racpp 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de racpp
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 06:51
0
Merci
ne m'etonne pas...
tu recréé une imageliste et tu l'affecte a ta listview

ta listview n'a donc plus qu'une seule icone qu'elle peut afficher..

que souhaites tu faire ?

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 20 févr. 2008 à 09:29
0
Merci
Bien je souhaiterais que quand j'ajoute un fichier il gardfe son icone qui lui est associer, et ce pour chaque item que j'ajouterais a la listview.

Vive le rugby XIII
Commenter la réponse de akalys
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 09:33
0
Merci
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
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 09:37
0
Merci
[edit]
je voulais dire ImgList system

SHFILEINFO sfi;
himageList = GetFileInfo("C:\", SHGFI_SYSICONINDEX Or SHGFI_SMALLICON, sfi);

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 20 févr. 2008 à 09:49
0
Merci
tu ne crée pas d'image list dans ton code.
et getfileinfo visual me dis qu'il connais pas ^^.

il ne faudrait pas justement que je crée plusieurs image list ?

Vive le rugby XIII
Commenter la réponse de akalys
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 10:03
0
Merci
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

pour le GetFileInfo, pardon, c'est une sub (extraite de http://files.codes-sources.com/fichier.aspx?id=7433&f=Module_IDL_Operations.bas) qui simplifie en réalité ShGetFileInfo.
pour l'uimagelist systeme, il faudrait plutot faire :

SHFILEINFO sfi;
himageList = SHGetFileInfo("C:\", 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 20 févr. 2008 à 10:08
0
Merci
D'accord je viens de comprendre, il faut que je crée une seul image liste une seule fois et que je mette tout les icone dedans.

Il faut donc que je crée mon image list en dehors de ma listview si je montre pas?

Car sinon elle va être recrée a chaque fois.

je viens d'essayer ta commande

himageList = SHGetFileInfo("C:\", 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

Et sa me met une error :    cannot convert from 'DWORD_PTR' to 'HIMAGELIST

Vive le rugby XIII
Commenter la réponse de akalys
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 22:04
0
Merci
j'avais tenté de le mettre sur cette voie, mais apparemment sans succès ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 22 févr. 2008 à 15:06
0
Merci
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

merki :))

Vive le rugby XIII
Commenter la réponse de akalys
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 22 févr. 2008 à 16:23
0
Merci
Apparament la commande
himglist=(HIMAGELIST)SHGetFileInfo(0,0,&sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

Modifirais l'image list system charger lors d'un GetOpenFileName.

Il faudrait donc que je la réinitialise après utilisation
comment faire ?

Vive le rugby XIII
Commenter la réponse de akalys
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 22 févr. 2008 à 16:28
0
Merci
ca ne modifie pas l'iml... ce serait grave, non ?

qu'est-ce qui te fait arriver a cette conclusion ?

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 22 févr. 2008 à 16:33
0
Merci
bien je ne sais pas trop, mais après la premiere execution et initialisation
de

himglist=(HIMAGELIST)SHGetFileInfo(0,0,&sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

toute les fenêtre que j'ouvre à l'aide de GetOpenFileName sont bugué, on ne voit plus les icone dans cette derniere fenetre ouverte....

Vive le rugby XIII
Commenter la réponse de akalys
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 22 févr. 2008 à 16:44
0
Merci
une fuite mémoire malencontreuse, je pense....
un CloseHandle manquant a un endroit, par exemple.

a voir ce qu'il faut nettoyer derrière ces APIs

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
akalys 31 Messages postés mercredi 6 février 2008Date d'inscription 6 janvier 2010 Dernière intervention - 22 févr. 2008 à 16:46
0
Merci
D'accord je vais regarder tout cela, je te remercie et je tient au courant quand j'ai trouvé ce qu'il manque

Merci

Vive le rugby XIII
Commenter la réponse de akalys
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 22 févr. 2008 à 20:52
0
Merci
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.
Commenter la réponse de racpp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.