在一个WinXP安装中无法正确显示alpha混合图标的工具栏

时间:2014-05-07 22:18:17

标签: c++ winapi mfc

我,或者更确切地说是我的一位用户,在他的Windows XP安装中无法正确显示alpha混合图标时会遇到一个非常奇怪的问题。通常alpha混合的图标不应该是XP和更新版本的问题,但这个问题真的令我感到困惑。

我有一个MFC CToolBar,所以几乎是一个普通的WinAPI工具栏,而且我用CImageList(所以基本上是一个普通的WinAPI图像列表)来提供它。屏幕模式的回退代码< 32位或更早的操作系统,它以8位透明度读取我的位图,并将其减少为预先乘以1位透明度。在XP上,具有32位位深度(由用户确认他使用这些设置,并且由于后备代码,图标实际上正确地显示了16位位深度),我使用{{1创建了图像列表标记,如MSDN中所示。此外,使用ILC_COLOR32(bitcount = 32,planes = 1)创建输入图像列表的位图。

在我迄今为止亲自测试过的所有系统上,这项工作都是预期的,即我在工具栏上获得了很好的alpha混合32位图标。但是,在用户的XP安装中,它看起来像这样:http://bugs.openmpt.org/file_download.php?file_id=102&type=bug 如果完全忽略了alpha通道,那么这就是图标的样子(你可以通过一些错误来判断通常不可见的像素,因为alpha通道是完全透明的)。因此,尽管使用的是XP,尽管使用了32位屏幕模式,尽管使用了CreateCompatibleBitmap,但完全忽略了alpha通道。

我之前从未见过这样的行为,显然用户并没有遇到其他应用程序的问题。在WinXP上的工具栏上使用alpha混合图像时,我有什么想念吗?

可以找到创建图像列表图像的相关代码here(32位屏幕模式的代码位于底部)和there(特别是PNG :: Bitmap :: ToDIB)。

1 个答案:

答案 0 :(得分:2)

我暂时没有这样做,但我相信你需要创建一个32-bpp的DIBSECTION而不是兼容的位图来传递到工具栏中,否则alpha通道可能会丢失 - 即使是在具有32-bpp显示屏的系统。