Delphi - Заполняет imagelist со значками во времени выполнения, 'уничтожает' прозрачность

Я провел часы для этого (простого) и не нахожу решение:/

Я использую D7 и TImageList. ImageList присвоен панели инструментов. Когда я заполняю ImageList во время проектирования, значки (с частичной прозрачностью) выглядят хорошо. Но я должен заполнить его во времени выполнения, и когда я делаю это, значки выглядят довольно погаными - завершенный свободный из частичной прозрачности.

Я просто попытался загрузить значки из .res файла - с тем же результатом. Я попробовал сторонние списки изображений также без успеха. У меня нет подсказки, что я мог сделать:/Спасибо 2 все ;)

править:

Чтобы быть честным, я не знаю точно, что продолжается. Альфа-смешивание является корректным термином... Вот 2 screenies:

Значок добавляется во время проектирования: alt text
(источник: shs-it.de)

Значок добавляется во времени выполнения: alt text
(источник: shs-it.de)

Ваш комментарий, что альфа-смешивание не поддерживается просто, принес решение: я отредактировал изображение в редакторе и удалил "альфу, смешанную" пиксели - и теперь это выглядит хорошо. Но его все еще странный, что значки смотрят другой при добавлении во времени выполнения вместо времени проектирования. Если бы Вы (или кто-то еще ;) может объяснить это, я был бы счастлив ;) спасибо за Вас поддерживает!

6
задан Glorfindel 29 July 2019 в 23:09
поделиться

3 ответа

Как сказал Джереми, это действительно ограничение Delphi.

Я использовал один способ обхода изображений, которые я помещал на кнопки (в моем случае PNG с альфа-прозрачностью), - это сохранять PNG как ресурсы и во время выполнения рисовать их на растровом изображении размером с кнопку, заполненном clBtnFace. Затем растровое изображение использовалось как глиф элемента управления.

Встроенная поддержка значков с альфа-масками в Delphi очень ограничена, однако есть отличная библиотека значков kicon , которая может помочь.

0
ответ дан 17 December 2019 в 02:24
поделиться

Пару лет назад у меня были точно такие же проблемы. Это проблема Delphi. В итоге я поместил изображения в список во время разработки, хотя мне этого очень не хотелось. Мне также пришлось использовать список изображений DevExpress, чтобы получить наилучшие результаты, и использовать 32-битные цветные изображения.

0
ответ дан 17 December 2019 в 02:24
поделиться

Для поддержки альфа-прозрачности вам необходимо создать список изображений и заполнить его во время выполнения:

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;
end;

// this could be e.g. in the form's or datamodule's OnCreate event
begin
  // create the imagelist
  ImageList := TImageList.Create(Self);
  ImageList.Name := 'ImageList';
  ImageList.DrawingStyle := dsTransparent;
  ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy);
  // populate the imagelist with png images from resources
  AddPngFromResource(ImageList, ...);
  // or icons
  AddIconFromResource(ImageList, ...);

end;
6
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: