Delphi - заполнение списка изображений значками во время выполнения «разрушает» прозрачность - PullRequest
6 голосов
/ 17 июня 2010

Я потратил часы на этот (простой) и не нашел решения: /

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

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

редактирование:

Если честно, я не знаю точно, что происходит. Альфа-смешивание - правильный термин ... Вот 2 экрана:

Значок добавлен во время разработки: альтернативный текст http://shs -it.de / tmp / icon-designtime.JPG

Значок добавлен во время выполнения: альтернативный текст http://shs -it.de / tmp / icon-runtime.JPG

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

Ответы [ 3 ]

6 голосов
/ 17 июня 2010

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

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;
0 голосов
/ 17 июня 2010

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

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

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

0 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...