Ответ: Эту тему можно было бы также назвать," как отобразить те же самые иконки что использует Windows". Иконки для дисков, папок, документов, эксплорера, соседства в сети, и так далее, все расположены в системном ImageList. Большинство иконок находится в SHELL32. DLL, но другие добавлены к системному ImageList операционной системой. Чтобы отображать те же самые иконки, все что Вы должны сделать — получить дескриптор Handle системного ImageList.
Шаг 1: Включите #include описание SHELLAPI.H
#include <vcl\vcl.h> #pragma hdrstop #include "MAINFORM.h" #include <win32\shellapi.h>
Шаг 2: API функция SHGetFileInfo позволяет Вам отыскивать системный ImageList. Добавьте Image и ImageList на главную форму вашей программы. Не добавляйте никаких иконок в ImageList. Добавьте этот код в конструктор вашей формы, чтобы связать ImageList с системным ImageList.
// Argument description: // 1st arg -> "" : filename, not needed // 2nd arg -> 0 : file attributes flag, not needed because the last // arg does not contain SHGFI_USEFILEATTRIBUTES // 3rd arg -> &info : this argument is always the address of a // SHFILEINFO structure. // 4th arg -> sizeof(info) : this arg is always sizeof(SHFILEINFO) // 5th arg -> flags : (see notes below)
SHFILEINFO info; DWORD ImageHandle = SHGetFileInfo("", 0, &info, sizeof(info), SHGFI_ICON | SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX); // если функция выполнена успешно, присвойте возвращенный дескриптор TImageList
// Обратите внимание, что управление TImageList, кажется, корректирует его высоту
// и ширину, когда Вы назначаете ее дескриптор. Также обратите внимание, что установка
// ShareImages в true предупреждает попытки TImageList к удалению основного системного
// ImageList (хотя оболочка блокирует эту попытку). if (ImageHandle != 0) { ImageList1->Handle = ImageHandle; ImageList1->ShareImages = true; } // Если все прошло согласно плану,
// в Image отобразится первый значок
if(ImageList1->Count > 0) ImageList1->GetIcon(0,Image1->Picture->Icon); // 0 is the icon's index
Пояснение: Возвращаемое значение от SHGetFileInfo получает различное значение, основанное на последнем параметре функции. Если последний параметр содержит флаги SHGFI_ICON или SHGFI_SYSICONINDEX, то возвращаемое значение — дескриптор системного ImageList.
Вот описание флагов th для последнего параметра в SHGetFileInfo:
SHGFI_ICON : определяет, что результатом будет дескриптор системного imagelist Также определяет как будет заполнена структура информации.. SHGFI_SHELLICONSIZE: Аналогично SHGFI_ICON, но возвращает пиктограмму
согласно Shell-размерногсти. При отсутствии этого флага
будет использован стандартный размер как у системной иконки . Выберите, что есть четыре классы значков в win95 (system large, system small, shell large and shell small). SHGFI_SMALLICON: Аналогично SHGFI_ICON, но возвращает дескриптор
маленькой иконк. Существует два системных списка иконок; один
для маленьких иконок и один для больших иконок. И они
не совсем идентичны. Большие иконки — более причудливые.
Большие иконки для дисководов гибких дискет
содержат небольшие иконки дисков, но маленьких иконок
не сделано. Насколько мне известно, и маленький и большой
imagelists содержат одинаковые номера иконок. Опустите
этот параметр, чтобы использовать большие значки вместо маленьких
SHGFI_SYSICONINDEX: Будет найден индекс иконки внутри списка
пиктограмм системы, и он будет помещен в член iIcon структуры.