Форум: "Начинающим";
Текущий архив: 2017.10.08;
Скачать: [xml.tar.bz2];
ВнизИконки в TImage из Imagelist, теряется прозрачность Найти похожие ветки
← →
Dmitry (2015-11-07 21:06) [0]Доброго времени суток, Уважаемые.
Необходимо динамически создавать Image на ScrollBox и загружать иконки из Imagelist. В Imagelist загружены файлы ico 64x64.
ImageList1.BkColor := clNone;
ImageList1.BlendColor := clNone;
ImageList1.DrawingStyle := dsTransparent;
ImageList1.ImageType := itImage;
ImageList1.Masked := false
ImageList1.ShareImages := true;
Делаю так
var ImagesArray: Array of TImage;
...
SetLength(ImagesArray, High(ImagesArray)+1);
ImagesArray[High(ImagesArray)] := TImage.Create(ScrollBox1);
with ImagesArray[High(ImagesArray)] do
begin
Left := X;
Top := Y;
Height := 64;
Width := 64;
ShowHint := true;
Tag := High(ImagesArray); // Для дальнейшей индексации
Parent := ScrollBox1;
Transparent := true;
NodeMainImageList.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);
Repaint;
end;
получаю картинку на черном фоне. Если сопоставляю не TIcon а TBitmap
NodeMainImageList.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);
получаю картинку на белом фоне.
Что не так делаю ?
← →
Dmitry (2015-11-07 21:13) [1]Исправление:
ImageList1.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);
ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);
← →
han_malign © (2015-11-10 12:32) [2]
> ImageList1.Masked := false
ILC_MASK - Use a mask. The image list contains two bitmaps, one of which is a monochrome bitmap used as a mask. If this value is not included, the image list contains only one bitmap.
ILD_TRANSPARENT - Draws the image transparently using the mask, regardless of the background color. This value has no effect if the image list does not contain a mask.
← →
Dmitry (2015-11-11 20:14) [3]Нет у меня в Delphi7 параметра ILD_TRANSPARENT при методе ImageList1.Draw, поэтому
ImageList1.Draw(ImagesArray[High(ImagesArray)].Canvas, 0, 0, tNodeData.VisualParam.MainImage_Index, ILD_TRANSPARENT);
не получается.
Сделал так. Конвертировал ico в bmp при помощи http://image.online-convert.com/ru и оставил
ImageList1.GetIcon(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Icon);
Всё работает. Пока не пойму почему, но работает.
← →
han_malign © (2015-11-12 17:09) [4]
> > ImageList1.Masked := false
- это означает, что при вызове ImageList_Create() флаг ILC_MASK не ипользовался - что в свою очередь означает *полную и безнадежную бесполезность* флага ILD_TRANSPARENT в ImageList_GetIcon() и ImageList_Draw()...
> Всё работает. Пока не пойму почему, но работает.
потому, что
> Сделал так. Конвертировал ico в bmp ...
теперь осталось заменить на
ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap);
← →
Dmitry (2015-11-12 18:56) [5]ImageList1.GetBitmap(tNodeData.VisualParam.MainImage_Index, ImagesArray[High(ImagesArray)].Picture.Bitmap); - белый фон, в лучшем случае. В худшем - изображение с каким-то хаотичным пятнистым фоном. Выкладывать скриншоты этого безобразия например на Радикал для дальнейшего анализа Уважаемыми Гуру считаю лишним. Уточню лишь, что конвертировал в .bmp не файлы .ico а файлы .png (иконки я создавал именно из имеющихся готовых png тем же самым конвертером, так что png у меня имеются). Видимо тот конвертор какой-то "не такой как все" :-)
Искать по интернету и пробовать еще кучу конверторов - а надо ли ? Разве что в запасе у кого-нибудь есть надежный, проверенный годами...
← →
p © (2015-11-12 20:14) [6]ImageList1.ColorDepth = cd32Bit
← →
p © (2015-11-12 20:16) [7]BkColor = цвет фона ScrollBox
← →
han_malign © (2015-11-13 12:12) [8]
> конвертор какой-то "не такой как все"
- на правах рекламы http://www.xnview.com/en/ - как ACDC в лучшие годы, но уже лучше и бесплатно(для некомерческого использования)...
> В худшем - изображение с каким-то хаотичным пятнистым фоном.
- походу ImageList умнеет с каждым днем, и таки умудрился альфа-канал подгрузить и потом правильно конвертнуть в ico...
Но это уже гадание на кофейной гуще...
← →
Dmitry (2015-11-13 21:50) [9][6]: Нет в DesignTime такого свойства. Создавать динамически и грузить из ресурса - не вариант, иконки 10 раз еще изменятся.
[7]: А вот это помогло. И исходные ico и bmp 64х64 32 bit стали отображаться корректно при ImageList1.GetIcon().
Спасибо, наверное тема закрыта. Хотя... Я не настолько профи в Delphi (при этом пишу понемногу от случая к случаю вроде бы как 2002 года), чтобы разобраться почему ImageList1.DrawingStyle := dsTransparent "не срабатывает" при ImageList1.Draw() (с иконками творилось абсолютно то же самое). В фотошопе могу вручную подсунуть прозрачную основу на любое изо (и получить тем самым png), а вот что происходит в Delphi - не могу объяснить...
← →
han_malign © (2015-11-17 11:28) [10]
> а вот что происходит в Delphi - не могу объяснить...
- а вот Delphi тут совершенно ни при чём, TImageList - это оболочка компонента Windows https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761389%28v=vs.85%29.aspx
И повторю в третий раз, но прямым текстом - сделай ImageList1.Masked := true - и будет тебе счастье...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.10.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.001 c