C++ 带有alpha混合图标的工具栏在一次WinXP安装中未正确显示

C++ 带有alpha混合图标的工具栏在一次WinXP安装中未正确显示,c++,winapi,mfc,C++,Winapi,Mfc,一、 或者更确切地说,我的一个用户,有一个非常奇怪的问题,阿尔法混合图标不能在他的Windows XP安装中正确显示。通常情况下,alpha混合图标在XP和更新版本上不应该是个问题,但这一个确实让我感到困惑 我有一个MFC CToolBar,几乎是一个普通的WinAPI工具栏,我给它提供了一个CImageList(基本上是一个普通的WinAPI图像列表)。屏幕模式

一、 或者更确切地说,我的一个用户,有一个非常奇怪的问题,阿尔法混合图标不能在他的Windows XP安装中正确显示。通常情况下,alpha混合图标在XP和更新版本上不应该是个问题,但这一个确实让我感到困惑

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

到目前为止,在我个人测试过的所有系统上,这一切都按预期进行,也就是说,我的工具栏上有很好的alpha混合32位图标。但是,在用户的XP安装上,它看起来是这样的: 如果完全忽略alpha通道,图标就是这个样子(您可以通过一些通常不可见的错误像素来判断,因为alpha通道是完全透明的)。因此,尽管在XP上,尽管使用32位屏幕模式,尽管使用了
ILC_COLOR32
,alpha通道还是被完全忽略了

我以前从未见过这种行为,显然用户在其他应用程序中没有遇到过这种问题。在WinXP上使用工具栏上的alpha混合图像时,有什么我没有记住的吗


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

我已经有一段时间没有这样做了,但我相信您需要创建一个32 bpp的DIBSECTION,而不是一个兼容的位图才能进入工具栏,否则,alpha通道可能会丢失,即使是在显示为32 bpp的系统上。

我不是下一个投票人,但如果您不将问题代码段的小型可编译版本放在此处,人们将很难对解决方案做出有用的评论。XP不受支持。即使alpha通道正常工作,这些图标也会很糟糕。如果这是最重要的错误,你可以去度假!!!但真正要求任何人花时间解决一个问题,这个问题仅仅是表面的,只会影响到一个过时的操作系统,只需使用256色图标就可以解决……莱克:首先,我更感兴趣的是知道是否有人熟悉这些症状。我不认为用户设置中暴露的行为应该发生在正常的Windows安装上,但人们可能知道需要传递的标志,例如在创建图像列表时。啊哈,很有趣。显然,使用
CreateBitmap
(不带“兼容”部分)或
CreateDIBSection
似乎都可以工作。伟大的更新:现在看来
CreateDIBSection
CreateBitmap
在RDP会话上都失败了。只有
CreateCompatibleBitmap
在那里工作,但问题是另一个函数实际上并不返回错误,它们只会导致黑色图标,因此我无法在这两种方法之间动态切换。。。有什么想法吗?这是本文第一次提到远程桌面。如果存在一些限制,我不会感到惊讶,但必须有一种解决方法,因为许多其他应用程序在远程桌面上显示正确的工具栏图标。是的,这也是我想知道的。我尝试过稍微修改一下原始的
CreateCompatibleBitmap
调用(之前,由于输入错误,它使用的是桌面DC而不是工具栏DC),但尽管这在RDP场景中有效,但在原始场景中仍然不起作用。