TImageList - True color + альфа-канал против 8-битного (256 цветов)
Я использую C++ Builder 2009, но я пометил это и для Delphi, так как я ожидаю, что точно такая же проблема существует и там.
я использую TImageList
(16x16) и связать его с TListView
(SmallImages) и TTreeView
,
Я добавлял новые иконки через IDE (время разработки) и импортировал некоторые значки 16x16 True color + альфа-канал. В IDE они выглядели нормально
Во время выполнения они выглядят не очень хорошо:
Обратите внимание на края особенно. Верхний значок - значок 5, а нижний значок - значок 7. Посмотрите, как они должны выглядеть на рисунке выше.
Когда я преобразую значки в 8-битные (256 цветов) значки и импортирую их через IDE, они отлично выглядят во время выполнения! Так что это, безусловно, решение для меня. Но значки, очевидно, теряют информацию, и, хотя, вероятно, едва заметны в иконках 16x16, меня это беспокоит, что я не могу найти, почему это происходит?
ImageList создается во время разработки и имеет свойства по умолчанию.
Я также попробовал: DrawingStyle = dsTransparent
а также ColorDepth = cd32Bit
после чего мне пришлось снова импортировать иконки через IDE. Результат тот же. Интересно, нужно ли мне установить конкретный BlendColor
?
Нужно ли делать что-то особенное для поддержки настоящих цветных значков? Или проблема с TTreeView и TListView? Это ограничение VCL или Windows или.. Мысли, предложения?
- Дополнительная информация - после прочтения комментария Дэвида.
Я добавил новый TImageList в свой проект и добавил 32-битные иконки с альфа-каналом. Затем я "взломал" свой код, чтобы всегда использовать этот ImageList, и он работал прекрасно.
Что я делаю в коде, так это потому, что у меня есть набор значков, которые я использую для всех ОС (очень связанных с приложением), и потому что я также использую значки, которые зависят от ОС, такие как значки папок, значки CD и т. Д. У меня есть ImageList который содержит все значки (для ОС и приложения) и при запуске программы и проверке ОС, я копирую нужные мне значки ОС из одного списка в список, который я использую.
Вот так:
TIcon *Icon = new TIcon() ;
for (int x = 0 ; x < OS_Specific_count ; x++)
{
OS_xx_ImageList->GetIcon(x, Icon) ;
Use_ImageList->ReplaceIcon(x, Icon) ;
}
delete Icon ;
Я боюсь, что проблема в этой части кода!
- Дополнительная информация - после более тщательного тестирования
Если я переписать код что-то вроде:
TBitmap *Bitmap= new TBitmap () ;
for (int x = 0 ; x < OS_Specific_count ; x++)
{
OS_xx_ImageList->GetBitmap(x, Bitmap) ;
Use_ImageList->Replace(x, Bitmap, NULL) ;
}
delete Bitmap;
У меня похожие проблемы, но не совсем такие же. Кажется, прозрачность теряется!
Я также заметил, что:
Use_ImageList->AddImage(OS_xx_ImageList, x) ;
начиная с пустого Use_ImageList, похоже, правильно сохраняет все данные альфа-канала! Может быть, я должен переписать код, чтобы всегда копировать партию таким образом...