Листинг 4.36.
Пример получения значка заданного файла (или папки)
procedure TForm1.cmbLoadIconClick(Sender: TObject);
begin
//Определение большого и малого значков файла
imgLarge.Picture.Icon.Handle := GetFileIcon(txtFile.Text);
imgSmall.Picture.Icon.Handle := GetFileIcon(txtFile.Text, True);
end;
Пример определения значка файла приводится на рис. 4.10.
Рис. 4.10. Определение значка, ассоциированного с файлом
На самом деле функция из листинга 4.35 может определять значки не только файлов, но и каталогов, дисков и виртуальных папок ( Мой компьютер, Рабочий стол, Панель управления и т. д.). Правда, в последнем случае используемая в листинге API-функция SHGetFilelnfo требует первый параметр специального вида (не строка). Частично работа с таким представлением путей рассмотрена в подразд. «Окно выбора папки» разд. 2.4.
В заключение скажем несколько слов о прочих полезных возможностях API-функции SHGetFileInf о. Недаром она называется не SHGetFilelcon или что-то подобное: она позволяет получить гораздо больше информации, нежели просто значок файла. Эта информация зависит от набора флагов, передаваемых в функцию в качестве последнего параметра. Но сначала рассмотрим, из каких полей состоит структура SHFILEINFO, потому что результат (за редким исключением) помещается именно в ее поля:
• hIcon (типа HICON) – дескриптор значка заданного путем объекта (первый параметр функции SHGetFilelnfo);
• iIcon (типа Integer) – номер значка в системном компоненте ImageList;
• dwAttributes (типа DWORD) – атрибуты заданного путем объекта;
• szDisplayName (типа array [0. МАХ_РАТН-1] of AnsiChar) – буфер для имени заданного объекта (например, сочетание имени и метки диска, отображаемое в Проводнике Windows);
• szTypeName (типа array [0..79] of AnsiChar) – буфер для названия типа файла (например, Документ Microsoft Word).
На полях dwAttributes и ilcon подробно останавливаться не будем, зато рассмотрим, как заставить функцию SHGetFilelnfo заполнить остальные поля структуры (их проще всего использовать в Delphi). Вот используемые для этого флаги (имена целочисленных констант):
• SHGFIICON – поле hlcon заполняется дескриптором значка, ассоциированного с объектом; если при использовании дескриптор не сохраняется в каком-либо контейнере или прочем объекте, автоматически удаляющем ненужные значки (как в листинге 4.36), то после использования значок нужно удалить вручную (API-функция Destroylcon);
• SHGFI_LARGEICON, SHGFI_SMALLICON – ОНИ применяются В комбинации с SHGFIICON для получения большого или малого значков соответственно; использование флагов вместе не имеет смысла (будет получен малый значок);
• SHGFI_DISPLAYNAME—при наличии этого флага поле szDisplayName будет содержать дружественное пользователю имя объекта (например, System (С:));
• SHGFI_EXETYPE – при наличии этого атрибута полез zTypeName будет заполнено текстовым описанием типа файла.
Значения в приведенном списке можно, если не сказано иное, комбинировать при помощи операции битового ИЛИ (or).
Извлечение значков из ЕХЕ– и DLL-файлов
Наверняка вы знаете, что исполняемый файл, помимо кода программы, данных и прочей системной информации, может содержать также ресурсы. Так, из секции ресурсов берутся значки для ЕХЕ-файлов. Также в ЕХЕ– или DLL-файлах помещаются значки, используемые для ассоциированных с приложениями документов. Итак, в завершение главы рассмотрим еще один графический пример: создадим программу, способную извлекать упомянутые значки из DLL– или ЕХЕ-файлов (работает также и для ICO-файлов).
Пусть мы имеем путь файла, а также два списка (TImageList) для больших и малых значков соответственно. Тогда процедура, заполняющая списки значками, извлеченными из файла, может выглядеть следующим образом (листинг 4.37).