OVH Cloud OVH Cloud

TreeView, chargement d'icone

2 réponses
Avatar
Flzw
Donc j'ai besoin d'un TreeView qui affiche les differents diques disponibles
sur le systeme et quelques repertoires
J'arrive a lister les disques en utilisant les fonctions de shellapi et
l'ont peu aussi recuperé des infos sur les icones correspondants etc
En me basant sur MSDN je suis arrivé a quelquechose comme ca :

TVINSERTSTRUCT tvis;
SHFILEINFO shinfo;
HIMAGELIST ImageList;
HBITMAP hBmpTmp;
HDC hdc;

ImageList = ImageList_Create( 16, 16, NULL, 16, NULL);

SHGetDesktopFolder( &Desktop);
SHGetFileInfo( "C:\\", NULL, &shinfo, sizeof( SHFILEINFO),
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_ADDOVERLAYS);

hdc = GetDC( hWndTV);
hBmpTmp = CreateCompatibleBitmap( hdc, 16, 16);
DrawIcon( hdc, 0, 0, shinfo.hIcon);

TreeView_SetImageList( hWndTV, ImageList, TVSIL_NORMAL);

tvis.hParent = TVI_ROOT;
tvis.hInsertAfter = TVI_FIRST;
tvis.itemex.mask = TVIF_TEXT | TVIF_IMAGE;
tvis.itemex.pszText = shinfo.szDisplayName;
tvis.itemex.iImage = ImageList_Add( ImageList, hBmpTmp, NULL);

SendMessage( hWndTV, TVM_INSERTITEM, 0, (LPARAM) &tvis);
--
hWndTV est un handle a un TreeView Control que je crée avant

Donc c'est ce que j'ai compris en lisant MSDN qui n'est pas tres clair sur
le sujet
Donc en gros ca marche, ca marque bien "Local Disk (C:)" dans mon treeview
et il y a la place necessaire a l'icone sur la gauche, le probleme c'est que
a la place de l'icone j'ai un carré noir...
le probleme doit venir que je me trompe dans l'appel de DrawIcon mais je ne
sais pas trop comment je dois faire
Donc si quelqu'un peut m'aider

Merci

2 réponses

Avatar
Vincent Burel
"Flzw" wrote in message
news:botm8l$53s$
Donc j'ai besoin d'un TreeView qui affiche les differents diques


disponibles
sur le systeme et quelques repertoires
J'arrive a lister les disques en utilisant les fonctions de shellapi et
l'ont peu aussi recuperé des infos sur les icones correspondants etc
En me basant sur MSDN je suis arrivé a quelquechose comme ca :

TVINSERTSTRUCT tvis;
SHFILEINFO shinfo;
HIMAGELIST ImageList;
HBITMAP hBmpTmp;
HDC hdc;

ImageList = ImageList_Create( 16, 16, NULL, 16, NULL);

SHGetDesktopFolder( &Desktop);
SHGetFileInfo( "C:", NULL, &shinfo, sizeof( SHFILEINFO),
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_ADDOVERLAYS);

hdc = GetDC( hWndTV);
hBmpTmp = CreateCompatibleBitmap( hdc, 16, 16);
DrawIcon( hdc, 0, 0, shinfo.hIcon);

TreeView_SetImageList( hWndTV, ImageList, TVSIL_NORMAL);

tvis.hParent = TVI_ROOT;
tvis.hInsertAfter = TVI_FIRST;
tvis.itemex.mask = TVIF_TEXT | TVIF_IMAGE;
tvis.itemex.pszText = shinfo.szDisplayName;
tvis.itemex.iImage = ImageList_Add( ImageList, hBmpTmp, NULL);

SendMessage( hWndTV, TVM_INSERTITEM, 0, (LPARAM) &tvis);
--
hWndTV est un handle a un TreeView Control que je crée avant

Donc c'est ce que j'ai compris en lisant MSDN qui n'est pas tres clair sur
le sujet



faut aussi chercher dans google, vous auriez trouvé au moins ce que je vous
copie dessous :

la liste d'icones des fichier existe déjà, vous pouvez récupérer les
ImageList par les appelles suivants :

himlSmall = (HIMAGELIST)SHGetFileInfo((LPCSTR) "C:", 0, &sfi, sizeof
(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR) "C:", 0, &sfi, sizeof
(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

Ensuite vous pouvez communiquer ces images list à des TREEVIEW ou
LISTVIEW...
ne Pas détruire, ces Imageslistes sont systèmes.

Ensuite vous récupérer le numéro d'Icon dans vos images liste par exemple
comme ca
SHGetFileInfo((LPCSTR)filename, 0, &sfi, sizeof (SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

et voila votre numéro d'icone dans l'ImageList.
nuIconDansImageList =sfi.iIcon;

Vous n'avez donc aucun icone à créer, rien à dessiner, et y'a pas de
problème de HANDLE.

Vincent Burel.
Avatar
Christian ASTOR
Flzw a écrit:
Donc j'ai besoin d'un TreeView qui affiche les differents diques disponibles
sur le systeme et quelques repertoires



Pas tip top : pas de Memory DC, de SelectObject(), ... memory
leaks, etc...
De plus, il faudrait
SHGFI_SMALLICON ,
DrawIconEx() pour 16*16,
ImageList_Create( 16,16, ILC_COLORDDB | ILC_MASK,16,1 ),
ImageList_AddMasked(),
renseigner tvis.itemex.iSelectedImage,
etc...

Mais quelle que soit la méthode utilisée pour remplir le TreeView
(méthode 'officielle' => EnumDesk de la PSDK
(...Program FilesMicrosoft SDKsampleswinuiShellEnumDesk))
ce n'est pas une bonne façon de faire : il vaut mieux lui attribuer la
System ImageList (SHGFI_SYSICONINDEX | SHGFI_SMALLICON) dès la création
et on n'a plus ensuite qu'à insérer le bon index pour les icônes.