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, похоже, правильно сохраняет все данные альфа-канала! Может быть, я должен переписать код, чтобы всегда копировать партию таким образом...

0 ответов

Другие вопросы по тегам