Winapi VC++;带有alpha值的COLORREF

Winapi VC++;带有alpha值的COLORREF,winapi,visual-c++,colors,mfc,Winapi,Visual C++,Colors,Mfc,据我所知,VC++中定义的COLORREF是一个DWORD,看起来像0x00bbggrr,其中bb、gg和rr是用于红色、绿色和蓝色的字节。微软的文档表明 高阶字节必须为零 但在.NET中,它用于存储颜色的alpha值。 我的问题是: 将alpha值存储在COLORREF的高字节中是否有危险 但在.NET中,它用于存储颜色的alpha值 没有。COLORREF是GDI的typedef,GDI是用于图形的传统api,可以追溯到Windows 3.0版。严格地说,它是一个24bpp的api,不了解a

据我所知,VC++中定义的
COLORREF
是一个DWORD,看起来像
0x00bbggrr
,其中
bb、gg
rr
是用于红色、绿色和蓝色的字节。微软的文档表明

高阶字节必须为零

但在.NET中,它用于存储颜色的alpha值。 我的问题是:

将alpha值存储在COLORREF的高字节中是否有危险

但在.NET中,它用于存储颜色的alpha值

没有。COLORREF是GDI的typedef,GDI是用于图形的传统api,可以追溯到Windows 3.0版。严格地说,它是一个24bpp的api,不了解alpha的bean,当时还没有硬件。调色板是时尚,它们没有阿尔法的用途。顺便说一句,编程非常不愉快,我在RealizePalette()上丢了不少头发

.NET使用GDI+。首先在GDIPLUS .H SDK头中作为C++ API公开,并在Win3之后发布8年。随着硬件的发展,它支持32bpp和alpha通道。它对颜色值使用了非常不同的定义,即。它与COLORREF不兼容的地方不仅仅是添加的alpha通道,它还以完全相反的方式存储颜色。格式为0xAARGGBB。可能是故意的,这样可以很容易地看出代码何时意外地错误地使用了COLORREF:)


不确定您在哪里看到COLORREF被使用,没有匹配项。我很好奇,请用链接更新您的问题。

API如果希望
COLORREF
准确,可能会忽略最重要的位,或者失败,因为该值没有通过严格的验证“…必须为零”。在其他时候,该值实际上可能具有最高位的特殊含义。只有在内部使用时,您才可以使用备用位,但一旦您将这些值发布到API,您就可以准备好迎接惊喜了。对不起,我错了!有颜色课。然而,我正在开发一个系统,该系统有很多历史,其中一个主要对象使用COLORREF的颜色。这就是它序列化的方式。问题是当要更改序列化时,会使此对象的所有早期版本难以维护。因此,就支持而言,最简单的方法是使用已经序列化的COLORREF并将alpha存储在其中,以便以前的版本能够打开使用较新版本创建的对象。这取决于您自己。这应该不是问题,因为磁盘或网络不关心颜色是什么,所以您仍然可以使用32位。只需使用Color.FromArgb()和ToArgb()函数进行转换并强制转换int。是否需要反转字节是您必须找到的,请使用旧的序列化数据进行测试。水晶球说你不必这么做。