Пользователи, работающие с Delphi 7 и компонентом TImageList, иногда сталкиваются с проблемой потери прозрачности иконок, добавленных в runtime. При добавлении иконок в дизайнере (designtime) прозрачность сохраняется, но при добавлении в runtime (runtime) иконки теряют свою прозрачность. Это может быть связано с особенностями обработки изображений в runtime среде и отсутствием поддержки альфа-смешивания в Delphi 7.
Описание проблемы
Разработчик столкнулся с проблемой, когда иконки, имеющие частичную прозрачность и добавленные в TImageList в дизайнере, отображались корректно. Однако, при добавлении тех же иконок в runtime, прозрачность терялась.
Примеры изображений
На скриншотах видно, что иконка, добавленная в дизайнере, сохраняет прозрачность, в то время как иконка, добавленная в runtime, выглядит некорректно, без прозрачности.
Подтвержденный ответ
Решение проблемы заключается в редактировании изображений в графическом редакторе и удалении "альфа-пикселей", отвечающих за прозрачность. После этого иконки в runtime отображаются корректно.
Альтернативные решения
Использование сторонних библиотек, таких как DevExpress image list или kicon, которые могут обеспечить лучшую поддержку прозрачности.
Хранение изображений в ресурсах и их отрисовка на битмапе в runtime, что позволяет сохранить прозрачность.
Применение специализированных функций для добавления иконок и PNG изображений в TImageList с учетом поддержки альфа-канала.
Пример кода
function AddIconFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
Icon: TIcon;
begin
Icon := TIcon.Create;
try
Icon.LoadFromResourceID(HInstance, ResID);
Result := ImageList.AddIcon(Icon);
finally
Icon.Free;
end;
end;
function AddPngFromResource(ImageList: TImageList; ResID: Integer): Integer;
var
Png: TPngGraphic;
ResStream: TStream;
Bitmap: TBitmap;
begin
ResStream := nil;
Png := nil;
Bitmap := nil;
try
ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
Png := TPNGGraphic.Create;
Png.LoadFromStream(ResStream);
FreeAndNil(ResStream);
Bitmap := TBitmap.Create;
Bitmap.Assign(Png);
FreeAndNil(Png);
Result := ImageList.Add(Bitmap, nil);
finally
Bitmap.Free;
ResStream.Free;
Png.Free;
end;
// Для Delphi 2007 и выше, используйте следующий формат вызова метода ImageList_Create с указанием ILC_COLOR32 или ILC_MASK, в зависимости от версии Delphi
ImageList.DrawingStyle := dsTransparent;
ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy);
// ...
end;
Комментарии и дополнительные уточнения
Убедитесь, что используете версию TIcon.LoadFromResourceID, актуальную для вашей версии Delphi.
Функция ImageList_Create является частью Windows API и требует указания соответствующих флагов для поддержки 32-битного цвета или маски.
Для работы с ресурсами можно использовать различные редакторы, например, resxplor из набора демо-проектов Delphi.
Заключение
Понимание особенностей работы с прозрачностью в Delphi 7 и применение альтернативных решений позволяет успешно решать проблемы с потерей прозрачности иконок в TImageList.
Пользователи Delphi 7 сталкиваются с проблемой потери прозрачности иконок в `TImageList` при добавлении их в runtime среду, в отличие от дизайнера, где прозрачность сохраняется.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.