Icone listview

Résolu
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010 - 19 févr. 2008 à 17:47
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 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

16 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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;}

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>
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 févr. 2008 à 06:51
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
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
20 févr. 2008 à 09:29
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 févr. 2008 à 09:37
[edit]
je voulais dire ImgList system

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
20 févr. 2008 à 09:49
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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

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
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
20 févr. 2008 à 10:08
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2008 à 22:04
j'avais tenté de le mettre sur cette voie, mais apparemment sans succès ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Derniè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

merki :))

Vive le rugby XIII
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
22 févr. 2008 à 16:23
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 févr. 2008 à 16:28
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
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
22 févr. 2008 à 16:33
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 févr. 2008 à 16:44
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
0
akalys Messages postés 31 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 6 janvier 2010
22 févr. 2008 à 16:46
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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
Rejoignez-nous