TImageList - 真彩色+ alpha通道与8位(256色)

时间:2016-02-01 00:23:59

标签: delphi c++builder vcl delphi-2009

我使用c ++ Builder 2009,但我也为Delphi标记了这个,因为我预计那里也存在完全相同的问题。

我使用TImageList(16x16)并将其与TListView(SmallImages)和TTreeView相关联。

我通过IDE添加了新图标(设计时)并导入了一些16x16真彩色+ alpha通道图标。在IDE中,它们看起来很好:

enter image description here

在运行期间,它们看起来并不好看:

enter image description here

特别注意边缘。顶部图标为图标5,底部图标为图标7.查看它们应如何在上图中查看。

当我将图标转换为8位(256色)图标并通过IDE导入时,它们在运行时看起来很好!所以这对我来说无疑是一个解决方案。但是这些图标显然会丢失信息,虽然在16x16图标中可能几乎不会引起注意,但是我有点不知道为什么会发生这种情况?

ImageList是在设计时创建的,具有默认属性。

我还尝试过:DrawingStyle = dsTransparentColorDepth = cd32Bit之后我必须通过IDE再次导入图标。 结果是一样的。我想知道是否需要设置一个特定的BlendColor

我是否需要做一些特别的事情才能支持真彩色图标? 或者是TTreeView和TListView的问题? 这是VCL限制还是Windows或.. 想法,建议?

阅读David的评论后,

- 附加信息 -

我在我的项目中添加了一个新的TImageList,并添加了带alpha通道的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开始似乎正确保留所有alpha通道数据! 也许我应该重写代码以便总是以这种方式复制批次......

0 个答案:

没有答案