Как получить иконку из произвольного файла?
От: Trapper  
Дата: 12.11.03 13:44
Оценка:
Добрый день.
Использую VS2002, C++, MFC.

Ситуация — есть директория с файлами, надо их все загнать в CListCtrl. Причём перед названием каждого файла надо вставить иконку, с которой он отображается в Windows. То есть надо фактически сделать копию Windows — окошка, с такой функциональность. Проблема в том, что я не знаю, как из файла получить его иконку, функция ExtractIcon(Ex) здесь не подходит, она работает только с исполняемыми файлами или файлами .ico.

Что здесь можно придумать?
Trapper
Re: Как получить иконку из произвольного файла?
От: algol Россия about:blank
Дата: 12.11.03 14:07
Оценка:
Здравствуйте, Trapper, Вы писали:

T>Ситуация — есть директория с файлами, надо их все загнать в CListCtrl. Причём перед названием каждого файла надо вставить иконку, с которой он отображается в Windows. То есть надо фактически сделать копию Windows — окошка, с такой функциональность. Проблема в том, что я не знаю, как из файла получить его иконку, функция ExtractIcon(Ex) здесь не подходит, она работает только с исполняемыми файлами или файлами .ico.


T>Что здесь можно придумать?


Использовать системный ImageList и получать индекс иконки через SHGetFileInfo() с SHGFI_SYSICONINDEX.
Re[2]: Как получить иконку из произвольного файла?
От: Trapper  
Дата: 12.11.03 14:13
Оценка:
А можно капельку подробнее? Как это будет выглядить в коде, хотя бы примерно?
Trapper
Re[3]: Как получить иконку из произвольного файла?
От: Trapper  
Дата: 12.11.03 15:14
Оценка:
Я более — менее разобрался, но появилась большая проблема — при попытке взять иконку с текстового файла, иконка берётся, но у неё отвратительное качество. При поптыке взять с других файлов иконку (я пробовал на dll — файлах) иконка вообще не берётся!
Trapper
Re: Как получить иконку из произвольного файла?
От: TalleR  
Дата: 04.10.06 07:46
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, Trapper, Вы писали:

T>Что здесь можно придумать?


я испльзую вот этот код

// создаём имедж лист
HIMAGELIST sys_im_list;
sys_im_list = ImageList_Create(16, 16, ILC_COLORDDB, 0, 3);

sys_im_list = ImageList_LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(179 ), 16, 16, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_LOADTRANSPARENT);
ListView_SetImageList(this->m_hWnd, sys_im_list, LVSIL_SMALL);

// ковыряем иконку
DWORD dw = GetFileAttributes(путь к файлу);
SHGetFileInfo(имя файла, dw , &info, sizeof (SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SMALLICON);

// заносим иконку в имедж лист
int res = ImageList_AddIcon(sys_im_list, info.hIcon);

//выводм иконку в лист контрол
SetItem(номер пункта,0,LVIF_IMAGE,_T(""),res,0,0,i);


иконки отображаются полноцветные но есть одна проблема , то что из таких файлов как .exe , .ico , .lnk не ковыряются сами рисунки , т.е. в место них ковыряется системный рисунок
вот как сделать так чтобы ковырялись сами рисунки я хотел узнать
Re[2]: Как получить иконку из произвольного файла?
От: algol Россия about:blank
Дата: 04.10.06 10:16
Оценка:
Здравствуйте, TalleR, Вы писали:

TR>DWORD dw = GetFileAttributes(путь к файлу);

TR>SHGetFileInfo(имя файла, dw , &info, sizeof (SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON |

TR>иконки отображаются полноцветные но есть одна проблема , то что из таких файлов как .exe , .ico , .lnk не ковыряются сами рисунки , т.е. в место них ковыряется системный рисунок

TR>вот как сделать так чтобы ковырялись сами рисунки я хотел узнать

Убрать флаг SHGFI_USEFILEATTRIBUTES и GetFileAttributes(). С этим флагом берется иконка не из конкретного указанного файла, а стандартная для данного типа файлов.
Re[3]: Как получить иконку из произвольного файла?
От: TalleR  
Дата: 04.10.06 10:39
Оценка:
Здравствуйте, algol, Вы писали:

A>Убрать флаг SHGFI_USEFILEATTRIBUTES и GetFileAttributes(). С этим флагом берется иконка не из конкретного указанного файла, а стандартная для данного типа файлов.


да .. всё верно .. у меня всё заработало .. как это я сразу не догадался . спасиб )
если что в аську 202637286
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.