我使用c ++ Builder 2009,但我也为Delphi标记了这个,因为我预计那里也存在完全相同的问题。
我使用TImageList
(16x16)并将其与TListView
(SmallImages)和TTreeView
相关联。
我通过IDE添加了新图标(设计时)并导入了一些16x16真彩色+ alpha通道图标。在IDE中,它们看起来很好:
在运行期间,它们看起来并不好看:
特别注意边缘。顶部图标为图标5,底部图标为图标7.查看它们应如何在上图中查看。
当我将图标转换为8位(256色)图标并通过IDE导入时,它们在运行时看起来很好!所以这对我来说无疑是一个解决方案。但是这些图标显然会丢失信息,虽然在16x16图标中可能几乎不会引起注意,但是我有点不知道为什么会发生这种情况?
ImageList是在设计时创建的,具有默认属性。
我还尝试过:DrawingStyle = dsTransparent
和ColorDepth = 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通道数据! 也许我应该重写代码以便总是以这种方式复制批次......