Отображение иконок, используемых Windows.


Ответ: Эту тему можно было бы также назвать," как отобразить те же самые иконки что использует 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 структуры.

Copyright © 1997-2000 by Harold Howe. bcbdev.com
All rights reserved.
Переведено для сайта http://cbuilder.ru