Я провел часы для этого (простого) и не нахожу решение:/
Я использую D7 и TImageList. ImageList присвоен панели инструментов. Когда я заполняю ImageList во время проектирования, значки (с частичной прозрачностью) выглядят хорошо. Но я должен заполнить его во времени выполнения, и когда я делаю это, значки выглядят довольно погаными - завершенный свободный из частичной прозрачности.
Я просто попытался загрузить значки из .res файла - с тем же результатом. Я попробовал сторонние списки изображений также без успеха. У меня нет подсказки, что я мог сделать:/Спасибо 2 все ;)
править:
Чтобы быть честным, я не знаю точно, что продолжается. Альфа-смешивание является корректным термином... Вот 2 screenies:
Значок добавляется во время проектирования:
(источник: shs-it.de)
Значок добавляется во времени выполнения:
(источник: shs-it.de)
Ваш комментарий, что альфа-смешивание не поддерживается просто, принес решение: я отредактировал изображение в редакторе и удалил "альфу, смешанную" пиксели - и теперь это выглядит хорошо. Но его все еще странный, что значки смотрят другой при добавлении во времени выполнения вместо времени проектирования. Если бы Вы (или кто-то еще ;) может объяснить это, я был бы счастлив ;) спасибо за Вас поддерживает!
Как сказал Джереми, это действительно ограничение Delphi.
Я использовал один способ обхода изображений, которые я помещал на кнопки (в моем случае PNG с альфа-прозрачностью), - это сохранять PNG как ресурсы и во время выполнения рисовать их на растровом изображении размером с кнопку, заполненном clBtnFace. Затем растровое изображение использовалось как глиф элемента управления.
Встроенная поддержка значков с альфа-масками в Delphi очень ограничена, однако есть отличная библиотека значков kicon , которая может помочь.
Пару лет назад у меня были точно такие же проблемы. Это проблема Delphi. В итоге я поместил изображения в список во время разработки, хотя мне этого очень не хотелось. Мне также пришлось использовать список изображений DevExpress, чтобы получить наилучшие результаты, и использовать 32-битные цветные изображения.
Для поддержки альфа-прозрачности вам необходимо создать список изображений и заполнить его во время выполнения:
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;