Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как получить иконку файла


Автор: Riddik 20.9.2009, 21:31
Сорри, все уладил.
Заголовок темы переименовать не могу. 

помогите с такой проблемой:

В ListView выводятся имена файлов.
Как получить иконку файла и отобразить её в ListView?



Автор: SenkraD 20.9.2009, 23:16
Вообщем SHGetFileInfo и CUSTOMDRAW тебе в руки,
но можеш посмотреть http://www.experts-exchange.com/Programming/Languages/CPP/Q_10093381.html и http://www.eggheadcafe.com/software/aspnet/34346018/using-shgetfileinfo-cause.aspx

Автор: Riddik 20.9.2009, 23:41
Благодарю!

Автор: Andrey44 21.9.2009, 07:05
Цитата(SenkraD @  20.9.2009,  23:16 Найти цитируемый пост)
Вообщем SHGetFileInfo и CUSTOMDRAW тебе в руки

Ну я бы сделал немного по другому.
Вместо CUSTOMDRAW  - ListView_SetImageList
вместо SHGetFileInfo - SHGetImageList
Так можно получить иконку любого размера и с нормальным видом.
Если хочешь могу у себя поискать то что я когда-то писал.

Автор: Riddik 21.9.2009, 08:19
Andrey44, файлов буде несколько десятков в ListView, даже сотен.
Большая часть иконок повторяется.

Ничего страшного, что столько одинаковых иконок будут грузиться в ImageList?

Автор: Andrey44 21.9.2009, 08:48
Цитата(Riddik @  21.9.2009,  08:19 Найти цитируемый пост)
Ничего страшного, что столько одинаковых иконок будут грузиться в ImageList?

Они грузиться не будут

Автор: Riddik 21.9.2009, 10:16
Ну тогда отлично.

По функции 
HRESULT SHGetImageList(      
    int iImageList,
    REFIID riid,
    void **ppv
);

Судя по параметрам, из структуры WIN32_FIND_DATA ничего сюда ни пришить?

Можно пример? В MSDN не нашёл.

Вот есть у меня 
Код

him=ImageList_Create(GetSystemMetrics(SM_CXSMICON), 
                         GetSystemMetrics(SM_CYSMICON),
                         ILC_MASK,
                         0, 1);
                     
    
ListView_SetImageList(hwndLV, him, LVSIL_SMALL);   //hwndLV - HWND ListView 



Как мне во время заполнения ListView инфой по файлам из WIN32_FIND_DATA  добывать нужную иконку?

Автор: Andrey44 21.9.2009, 10:52
Код

HIMAGELIST hImageList = ImageList_Create(.....);
ListView_SetImageList(..., hImageList, ...);
HICON hIcon
SHFILEINFO fileInfo;
    SHGetFileInfo(pathFile, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX);
    IImageList *imList; 
    SHGetImageList(SHIL_SMALL, IID_IImageList, (void**)&imList);
    imList->GetIcon(fileInfo.iIcon, 0, &hIcon);

int index=-1;
index = ImageList_Add(.....);


LVITEM item;
    ZeroMemory(&item, sizeof(LVITEM));
    //name
    item.mask        = LVIF_TEXT | LVIF_IMAGE;
    item.iItem        = ListView_GetItemCount(...);
    item.iSubItem    = 0;
    item.pszText    = fileInfo.szDisplayName;
    item.iImage        = index;
    ListView_InsertItem(..., &item);
    //type
    item.mask = LVIF_TEXT;
    item.iSubItem    = 1;
    item.pszText    = fileInfo.szTypeName;
    ListView_SetItem(..., &item);
    //size
    item.iSubItem    = 2;
    s.Format(_T("%d kb"), findData.nFileSizeLow/1024);
    item.pszText    = s.GetBuffer();
    ListView_SetItem(..., &item);
    //path
    item.iSubItem    = 3;
    item.pszText    = pathFile;
    ListView_SetItem(..., &item);

Как-то так, посмотри должно работать.

Автор: Riddik 21.9.2009, 11:16
IImageList не опознан.
comctl32.dll подключена...

И утечек памяти никаких не будет после HGetImageList(SHIL_SMALL, IID_IImageList, (void**)&imList);

imList на что-то указывает, у меня все это дело в цикле будет.

Автор: Andrey44 21.9.2009, 11:18
Код

#include <CommonControls.h>

Автор: Riddik 21.9.2009, 11:36
Cannot open include file: 'CommonControls.h': No such file or directory


Где же он лежит?

Автор: Andrey44 21.9.2009, 11:50
Цитата(Riddik @  21.9.2009,  11:36 Найти цитируемый пост)
Где же он лежит? 

Как где? У тебя студия какая?

Автор: Riddik 21.9.2009, 13:24
Делаю проекты в 6.0, потом релиз собираю в 9-й.

Т.к. последняя меня уже достала своими тормозами и многочасовой компиляцией.

Сейчас попробовал сбрать в новой - теперь вся подключается все работает - большое спасибо за помощь!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)