Стандартный компонент TImageList входящий в состав любой версии Delphi, не поддерживает 32-х битных иконки с альфа каналом, что порой является большой проблемой при разработке графического интерфейса.
Эту проблему можно обойти созданием своего класса на основе TCustomImageList, который в свою очередь является предком стандартного TImageList. Все что нам понадобится, это переопределить метод Create в нашем новом классе:
Определяем наш новый класс
type
T32ImageList = class(TCustomImageList)
LibHandle: THandle;
procedure LoadLib(LibName: string);
procedure FreeLib;
procedure AddIconFromLib(IconName: string);
constructor Create(AOwner: TComponent); override;
end;
Описываем реализацию методов класса
constructor T32ImageList.Create(AOwner: TComponent);
begin
inherited Create(AOwner); //Вызываем родительский метод
Create Self.Handle := ImageList_Create(
Width, Height, ILC_COLOR32 or ILC_MASK, AllocBy, AllocBy);
//Заменяем старый дескриптор на новый только уже
// с поддержкой 32-х битных изображений ILC_COLOR32
Self.LibHandle := 0; //Инициализируем дескриптор для подгрузки dll
end;
procedure T32ImageList.LoadLib(LibName: string);
var
HLib: THandle;
begin
Hlib := 0;
if LibHandle <> 0 then FreeLib;
try
HLib := LoadLibrary(PChar(LibName));
if HLib = 0 then
ShowMessage('Can not load library ' + LibName);
finally
LibHandle := HLib;
end;
end;
procedure T32ImageList.FreeLib;
begin
if LibHandle <> 0 then FreeLibrary(LibHandle);
end;
procedure T32ImageList.AddIconFromLib(IconName: string);
var
LIcon: TIcon;
begin
try
LIcon := TIcon.Create;
LIcon.LoadFromResourceName(LibHandle, PChar(IconName));
Self.AddIcon(LIcon);
finally
if LIcon.HandleAllocated then LIcon.Free;
end;
end;
Процедуры LoadLib, FreLib и AddIconFromLib не обязательны, я их реализовал для удобной подгрузки иконок из отдельной dll библиотеки.
Пример использования класса:
Images: T32ImageList; // Глобальная переменная
procedure TForm1.LoadIcons; // Некая процедура загрузки иконок
begin
Images := T32ImageList.Create(Self); // Создаем наш класс
Images.LoadLib('icons.dll'); // Подгружаем библиотеку с иконками icons.dll
Images.AddIconFromLib('ICON_ADD'); // Добавляем иконки из icons.dll по имени
Images.AddIconFromLib('ICON_EDIT');
Images.AddIconFromLib('ICON_REMOVE');
Images.FreeLib; // Выгружаем библиотеку из памяти
MainMenu1.Images := Images; // Присваиваем наш ImageList к Главному меню.
end;
После таких не сложных манипуляций вы получите замечательные иконки в вашей программе.
Разумеется, что сами иконки должны быть в формате 32 бита и с альфа каналом.
Если вы подгружаете иконки из файлов, нужно учесть, что файл иконки может содержать в себе несколько форматов, например разных размеров 16х16, 32х32, или разных цветов 256, 16 миллионов и т.д. Для того чтобы программа знала, какого именно размера иконка вам нужна, необходимо предварительно задать размер. Что касается цветов, то тут небольшая загвоздка. Легче всего просто заранее отредактировать иконку и оставить в ней только те форматы, которые вы будите использовать.
Пример загрузки иконок из файлов:
procedure TForm1.LoadIcons;
var
TempIcon: TIcon;
begin
Images := T32ImageList.Create(Self); // Создаем наш класс
TempIcon := TIcon.Create; // Создаем иконку
TempIcon.SetSize(16, 16); // Прописываем размер 16х16
TempIcon.LoadFromFile('add.ico'); // Загружаем иконку из файла
Images.AddIcon(TempIcon); // Добавляем иконку к списку
TempIcon.Free; // Удаляем иконку из памяти
MainMenu1.Images := Images; // Присваиваем наш ImageList к Главному меню.
end;