Исправление отображения иконок .ico 48x48 с прозрачностью в программах на Delphi
При разработке программ на Delphi часто возникают вопросы, связанные с отображением иконок в пользовательском интерфейсе. Одной из таких проблем является корректное отображение иконок формата .ico размером 48x48 с поддержанием прозрачности. В данной статье мы рассмотрим, как решить эту проблему, опираясь на примеры кода на Object Pascal.
Проблема
Пользователь столкнулся с проблемой при отображении иконок размером 48x48 в всплывающем меню. При установке свойства BkColor в значение clNone иконки отображаются неэстетично, а при использовании ClMenu при выделении иконки появляется серый фон.
Решение
Чтобы решить данную проблему, необходимо учитывать следующие моменты:
A) Использование функции LoadImage для иконок большего размера, чем 32x32.
B) Создание 32-битного ImageList с помощью функции ImageList_Create во время выполнения программы для поддержки альфа-прозрачности.
C) Использование функции LoadIcon из ресурсов вместо использования ImageList в дизайнере.
D) Для устранения неэстетичного черного края вокруг иконки, следует использовать comctl32.dll версии 6 для включения стилей визуализации с плавными краями. Это достигается путем создания файла xxx.exe.manifest с указанным содержимым.
E) Присваивание команд может привести к появлению неэстетичного белого края вокруг иконок. Лучше использовать цикл For и функцию ImageList_ReplaceIcon.
Ниже представлен пример кода, который демонстрирует, как можно решить описанные проблемы:
procedure TForm1.LoadICO;
var
i: Integer;
h: HIcon;
folder: string;
filename: string;
begin
folder := GetCurrentDir + '\icon\';
// Создание 32-битного ImageList для поддержки альфа-прозрачности
ImageList1.Handle := ImageList_Create(48, 48, ILC_COLOR32 or ILC_MASK, 0, ImageList1.AllocBy);
// Загрузка иконок из файлов
for i := 0 to ImageCount - 1 do
begin
filename := folder + ParamStr(i + 1);
if FileExists(filename) then
h := LoadImage(0, PChar(filename), IMAGE_ICON, 48, 48, LR_LOADFROMFILE)
else
h := LoadIcon(hInstance, 'ICO1'); // Загрузка иконки из ресурсов
ImageList_AddIcon(ImageList1.Handle, h); // Добавление иконки в ImageList
DeleteObject(h);
end;
end;
Важно также создать файл xxx.exe.manifest с контентом, который позволит использовать стили визуализации из comctl32.dll версии 6:
В статье рассматривается проблема корректного отображения иконок формата `.ico` размером 48x48 с поддержкой прозрачности в программах на Delphi, с предложением решений, включая использование определенных функций и создание специального файла `.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.