Привет, уважаемые форумчане. Пишу файловый менеджер. Для отображения иконок файлов пользуясь функцией SHGetFileInfo(......). Но порблема в том что какои первый фаил наидет такими будут все остальные иконки. Пишу на Visual studio 2010 C++, MFC WinAPi .Пожайлуста помогите. Вот отрывок кода :
HICON CFilemanagerDlg::GetFileInfo(CString str)
{
UINT uFlags = SHGFI_ICON | SHGFI_ICONLOCATION | SHGFI_LARGEICON | SHGFI_DISPLAYNAME | SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_EXETYPE ;
CString tmp = (LPCWSTR)str;
memset(&m_sf,0,sizeof(m_sf));
HICON hicon;
CImageList * m_pImage = new CImageList();
m_pImage->Attach((HIMAGELIST)SHGetFileInfo(tmp,0,&m_sf,sizeof(m_sf),uFlags));
hicon = m_pImage->ExtractIcon(m_sf.iIcon);
m_pImage->Detach();
return hicon;
}
А Вот функция где вызывается GetFileInfo:
void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
{
CFileFind find;
count = 0; // Количество элемент в list control
CString temp;// временная переменная для хранения адресса из адрессной edit box-а которая характеризуется переменным-членом m_str
HICON h;// handle иконок
BOOL f;
temp = m_str; // Это переменные CString в которых->
str0 = temp; // ->сохраняются старые и новые пути каталогов->
dtemp = temp; // ->и файлов для навигации по директориямint index; // Это индекс иконок в image list
CImageList* imgList = new CImageList();
imgList->Create(32,32,ILC_MASK | ILC_COLOR32,0,0);
if(isRefrashe == true)
temp = str0;
f = find.FindFile(temp+"\\*");
while(f)
{
f = find.FindNextFile();
if(find.IsDots())
continue;
str = find.GetFilePath();
temp = str;
str0 = str;
/*(******)*/ h = GetFileInfo(str); //
CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off
ВОТ ЗДЕСЬ И ВЫЗЫВАЕТСЯ GetFileInfo()
if(h == 0)
{
MessageBox((LPCTSTR)_T("Error icon handle"),(LPCTSTR)_T("Error !"),MB_ICONSTOP);
exit(-1);
}
index = imgList->Add(h);
DestroyIcon(h);
m_list.InsertItem(count,str);
count++;
}
m_list.SetImageList(imgList, TVSIL_NORMAL);
find.Close();
}
На кой ляд перечислять все флаги? Вот к примеру SHGFI_EXETYPE напуркуа? Тем паче что:
SHGFI_EXETYPE (0x000002000)
Retrieve the type of the executable file if pszPath identifies an executable file. The information is packed into the return value. This flag cannot be specified with any other flags.
Здравствуйте, Melamed, Вы писали:
M>Здравствуйте, spacetime, Вы писали:
M>Во первых вызов функции SHGetFileInfo должен быть следующим
M>Код взят из собственного примера, написанного на чистом WINAPI.
M>
M>Хендл на иконку берется в shFi.hIcon и вставляется ручками в свой ImageList; M>Затем уничтожается иконка DestroyIcon(shFI.hIcon)
Немного изменил код вот, в .h файл диалога добавил переменную m_list_image типа CimageList в место локальной CimageList* m_pImage и делаю Add уже в самой функции GetPathIcon сократил число флаг оставив только самые нужные:
Потом делаю m_list.SetImageList(&m_list_image,LVSIL_SMALL)(Не в GetPathIcon а в другом месте тело программы).... Ничего не получается у всех файлов одна и та же иконка. Кажется все перепробовал
Что можно еще делать ?
Здравствуйте, De-Bugger, Вы писали:
DB>Здравствуйте, spacetime, Вы писали:
S>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?
DB>Все равно не читаете документацию:
DB>
DB>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.
DB>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
Здравствуйте, spacetime, Вы писали:
S>Здравствуйте, De-Bugger, Вы писали:
DB>>Здравствуйте, spacetime, Вы писали:
S>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?
DB>>Все равно не читаете документацию:
DB>>
DB>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.
DB>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
S>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится
Здравствуйте, spacetime, Вы писали:
S>Здравствуйте, spacetime, Вы писали:
S>>Здравствуйте, De-Bugger, Вы писали:
DB>>>Здравствуйте, spacetime, Вы писали:
S>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?
DB>>>Все равно не читаете документацию:
DB>>>
DB>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.
DB>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
S>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
S>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится
В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50,
и думаю перестанут иконки подгружаться через некоторое время.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, spacetime, Вы писали:
S>>Здравствуйте, spacetime, Вы писали:
S>>>Здравствуйте, De-Bugger, Вы писали:
DB>>>>Здравствуйте, spacetime, Вы писали:
S>>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?
DB>>>>Все равно не читаете документацию:
DB>>>>
DB>>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.
DB>>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
S>>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
S>>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится
А>В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50, А>и думаю перестанут иконки подгружаться через некоторое время.
Все прекрасно работает. Испытал вчера никаких проблем. А это количество у мена написано индекс это так так сказать динамическое количество в теле функции findFiles оно все время растет то есть это на самом деле индекс.
Здравствуйте, spacetime, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, spacetime, Вы писали:
S>>>Здравствуйте, spacetime, Вы писали:
S>>>>Здравствуйте, De-Bugger, Вы писали:
DB>>>>>Здравствуйте, spacetime, Вы писали:
S>>>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?
DB>>>>>Все равно не читаете документацию:
DB>>>>>
DB>>>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.
DB>>>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
S>>>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
S>>>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится
А>>В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50, А>>и думаю перестанут иконки подгружаться через некоторое время.
S>Все прекрасно работает. Испытал вчера никаких проблем. А это количество у мена написано индекс это так так сказать динамическое количество в теле функции findFiles оно все время растет то есть это на самом деле индекс.
Извените в "А это количество у мена написано индекс" не индекс a count