Как в c получить иконку файла

Обновлено: 04.07.2024

ну как это "не причем" Или вы видели как работает Explorer на других платформах.

Help will always be given at Hogwarts to those who ask for it.

Та, которая используется Explorer'ом.

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

KSA>Та, которая используется Explorer'ом.

надо воспользоваться функцией ExtractIconEx из Shell32.dll
иконка номер 3 из него же

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

KSA>Та, которая используется Explorer'ом.

я тоже долго и муторно пытался все сделать хотя бы через


в конце концов сделал


а еще, загляните сюда :

может, кто скажет, как это сделать ЕЩЕ умнее?
спасибо

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


!>я тоже долго и муторно пытался все сделать хотя бы через

!>в конце концов сделал

!>а еще, загляните сюда :

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

O>может, кто скажет, как это сделать ЕЩЕ умнее?

Умнее чего? Тебе нужны вещи, специфичные для виндов, вот и возись со спецификой.

Даю пару велосипедов на эту тему (код ниже):


В ShellIcons я определил некоторые именованные константы-проперти (не факт, что все правильно, мне нужно было всего 5 стандартных иконок, остальные я насувал без проверки)

в любом месте можно вызвать:
И посмотреть соответствие иконок номерам.

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

V>Здравствуйте, ole!, Вы писали:

O>>может, кто скажет, как это сделать ЕЩЕ умнее?

V>Умнее чего? Тебе нужны вещи, специфичные для виндов, вот и возись со спецификой.

V>Даю пару велосипедов на эту тему (код ниже):

V>Использовать так:
V>

V>В ShellIcons я определил некоторые именованные константы-проперти (не факт, что все правильно, мне нужно было всего 5 стандартных иконок, остальные я насувал без проверки)

V>в любом месте можно вызвать:
V>И посмотреть соответствие иконок номерам.

V>Сами классы:
V>

В Microsoft Windows все файлы имеют соответствующий значок (иконку), который может помочь пользователю быстро определить тип файла. Иконки могут быть встроены в исполняемую или динамическую связанную библиотеку (DLL) или храниться в файле значков. В каждом случае легко получить доступ к значку.

Иконки файлов

Каждый тип файла, распознаваемый Microsoft Windows, имеет связанный с ним значок, который отображается в различных приложениях, включая проводник Windows. Если файл не имеет известного типа, вместо него отображается значок по умолчанию. Если вы пишете программное обеспечение, которое работает с файлами, вы можете захотеть отобразить значки файлов аналогичным образом. Это может быть достигнуто с помощью класса Icon.

Класс Icon находится в пространстве имен System.Drawing. Экземпляры класса могут использоваться для представления значков Windows и получения информации, относящейся к этим значкам, или для преобразования их в другие форматы. Класс также включает в себя некоторые статические методы, один из которых может быть использован для получения значка файла. Этот метод называется "ExtractAssociatedIcon" и возвращает экземпляр значка, содержащий изображение для файла. Путь к файлу задается с помощью единственного параметра метода.

Давайте создадим простой проект Windows Forms, который позволит пользователю выбрать файл. Затем значок файла будет отображаться в собственном формате и после преобразования значка в растровое изображение.

Создание примера программы

Чтобы создать программу, запустите новый проект Windows Forms. Добавьте следующие три элемента управления и компонента в форму по умолчанию, перетащив их из панели инструментов и расположив по желанию:


Извлечение иконки

Извлечение значка произойдет, когда пользователь нажмет на кнопку. При этом откроется диалоговое окно открыть файл, в котором можно выбрать нужный файл. При нажатии кнопки OK соответствующий значок типа файла будет получен и использован в качестве значка основной формы, как показано в строке заголовка и панели задач. Затем значок будет преобразован в растровое изображение с помощью метода ToBitmap и отображен в элементе управления PictureBox.

Чтобы добавить функциональность, создайте событие Click для кнопки и добавьте следующий код:

Теперь вы можете запустить программу, чтобы увидеть извлечение значка в действии.

1>Надо работать через реестр

SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo("*.doc", 0, &sfi, sizeof(SHFILEINFO),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
m_hWordDocIcon = sfi.hIcon;
?

(Приведенный ниже код извлекает иконку, ассоциируемую шеллом с вордовыми документами)

Такая вот проблема — как, например, виндовый проводник определяет, какую иконку показывать, когда выводит списки файлов? С исполняемыми файлами все понятно — там есть ExtractIcon, а откуда он берет иконки для картинок, мпегов, офисных документов и проч?

Естественно, коль скоро я пишу сюда, хотелось бы решение именно на WinAPI (безо всякого MFC).

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

SA>Такая вот проблема — как, например, виндовый проводник определяет, какую иконку показывать, когда выводит списки файлов? С исполняемыми файлами все понятно — там есть ExtractIcon, а откуда он берет иконки для картинок, мпегов, офисных документов и проч?

SA>Естественно, коль скоро я пишу сюда, хотелось бы решение именно на WinAPI (безо всякого MFC).

Надо работать через реестр — берешь расширение
1) .acw в HKEY_CLASSES_ROOT ищешь ключ с таким именем, у него по умолчанию строка — acwfile
2) ищешь в HKEY_LLOCAL_MACHINE\SOFTWARE\Classes\acwfile\DefaultIcon —
%SystemRoot%\system32\accwiz.exe,0 — место файла и номер ресурса иконки
3) считываешь иконку и отрисовываешь LoadIcon(.

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

1>Здравствуйте Simontsev Andrew, вы писали:

SA>>Такая вот проблема — как, например, виндовый проводник определяет, какую иконку показывать, когда выводит списки файлов? С исполняемыми файлами все понятно — там есть ExtractIcon, а откуда он берет иконки для картинок, мпегов, офисных документов и проч?

1>Надо работать через реестр — берешь расширение

Для картинок, мпегов, офисных документов можно через реестр.
Для проч. можно использовать Windows Shell, например
IShellFolder::GetUIObjectOf(. __uuidof(IExtractIcon),,)

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

SA>Такая вот проблема — как, например, виндовый проводник определяет, какую иконку показывать, когда выводит списки файлов? С исполняемыми файлами все понятно — там есть ExtractIcon, а откуда он берет иконки для картинок, мпегов, офисных документов и проч?

SA>Естественно, коль скоро я пишу сюда, хотелось бы решение именно на WinAPI (безо всякого MFC).

Хотелось бы отметить, что этот пример от MS (как и примеры получения иконок файлов на gotdotnet) некорректен, т.к.
— в документации к SHGetFileInfo написано, что вызывающий отвечает за освобождение полученного хэндла иконки с помощью ф-и DestroyIcon
— объект Icon полученный с помощью Icon.FromHandle не владеет HICON, и соотв. при Dispose'е объекта Icon HICON не уничтожается

Т.к. не удобно хранить одновременно и Icon и HICON, то лучше использовать Bitmap.FromHicon, с полседующим уничтожением HICON.

На Дельфях это выглядит вот так

Вот, кажется, все, что надо:

Извините.
Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?
Уже полдня копаюсь никак.
Помогите.

B>Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?
B>Уже полдня копаюсь никак.
B>Помогите.

http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/SysImageList/sysImageList.jpg

eto to chto ti iskal.

nemogu ustanovit russkuy raskladku

http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/SysImageList/sysImageList.jpg

B>>Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?
B>>Уже полдня копаюсь никак.
B>>Помогите.

M>Get unlimited icons for files without bringing your application to its knees (if it has knees)

M>

M>eto to chto ti iskal.
M>

M>nemogu ustanovit russkuy raskladku

Читайте также: