在WinXP安装中,带有alpha混合图标的工具栏不能正确显示
Toolbar with alpha-blended icons not displaying properly on one WinXP installation
我,或者更确切地说是我的一个用户,有一个非常奇怪的问题,在他的Windows XP安装中,alpha混合图标不能正确显示。通常,在XP和更新的系统中,混合的图标应该不是问题,但是这个图标真的让我很困惑。
我有一个MFC CToolBar,所以几乎是一个正常的WinAPI工具栏,我用CImageList(所以基本上是一个正常的WinAPI图像列表)喂养它。屏幕模式有回退代码<32位或更早的操作系统,它读取我的位图,具有8位透明度,并将其减少到预乘的1位透明度。在XP上,使用32位深度(由用户确认他使用了这些设置,并且由于回退代码,图标实际上在16位深度下正确显示),我使用ILC_COLOR32
标志创建图像列表,如MSDN中所示。此外,输入图像列表的位图是用CreateCompatibleBitmap
(bitcount = 32, planes = 1)创建的。
到目前为止,在我个人测试的所有系统上,这个工作都是预期的,也就是说,我在工具栏上得到了不错的alpha混合32位图标。但是,在用户的XP安装中,它看起来是这样的:http://bugs.openmpt.org/file_download.php?file_id=102&type=bug这是完全忽略alpha通道时图标的样子(您可以通过一些通常不可见的错误像素来判断,因为alpha通道是完全透明的)。因此,尽管是在XP上,尽管使用32位屏幕模式,尽管使用ILC_COLOR32
, alpha通道被完全忽略。
我以前从未见过这样的行为,显然用户在使用其他应用程序时不会遇到这个问题。在WinXP的工具栏上使用alpha混合图像时,我是否错过了什么,我必须记住?
创建图像列表图像的相关代码可以在这里找到(32位屏幕模式的代码在底部)和那里(特别是PNG::Bitmap::ToDIB)。
我有一段时间没有这样做了,但我认为您需要创建一个32-bpp的DIBSECTION而不是一个兼容的位图来传递到工具栏中,否则alpha通道可能会丢失——即使在具有32-bpp显示器的系统上也是如此。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 你能在QDialog中添加一个工具栏吗
- CUDA不能在Visual Studio 2013 -工具包4.2,5.5和6上工作
- 在WinXP安装中,带有alpha混合图标的工具栏不能正确显示