C++ 绘制时,GDI函数将alpha通道设置为0。为什么?

C++ 绘制时,GDI函数将alpha通道设置为0。为什么?,c++,transparency,gdi,C++,Transparency,Gdi,我已经创建了32位DIB部分,用一些非零值(FillMemory)填充它,并使用GDI函数在它上面画图。 我查看了DIB部分的内存,发现现在每4个字节(alpha通道)都有一个0。 我在几年前就有过这种行为的解释,但没能再次找到它(也不记得GDI为什么会这样做)。 有人知道为什么GDI函数将alpha通道设置为0吗?这种行为有什么规范吗 这个想法是: dib = CreateDIBSection(hdc..., &bytes); FillMemory(bytes,...2

我已经创建了32位DIB部分,用一些非零值(FillMemory)填充它,并使用GDI函数在它上面画图。 我查看了DIB部分的内存,发现现在每4个字节(alpha通道)都有一个0。 我在几年前就有过这种行为的解释,但没能再次找到它(也不记得GDI为什么会这样做)。 有人知道为什么GDI函数将alpha通道设置为0吗?这种行为有什么规范吗

这个想法是:

    dib = CreateDIBSection(hdc..., &bytes);
    FillMemory(bytes,...255);
    memdc = CreateCompatibleDC(hdc);
    SelectObject(memdc, bid);
    MoveTo(memdc,...);
    LineTo(memdc,...);
    // look at every pixel in bytes
    // if alpha == 255 then it is undrawn pixel
    // and set alpha + premultiply colors otherwise
    AlphaBlend(hdc, ... memdc,...);

这个代码有效。但它假设GDI函数将alpha设置为0。我想确定这是一种“合法行为”。

这是因为在Windows GDI最初设计之后很久,alpha混合就已经成为绘图功能的一部分了。您必须使用相对较新的功能,如(自Windows2000AFAIK以来就存在)来获得该功能

最初,GDI的设计使由
RGB
宏组成的32位颜色值包含类似
0x00bbggrr
的颜色。就像你看到的。。。你认为是alpha通道的比特不是。GDI实际上将这些设置为零。透明度是通过使用遮罩而不是alpha混合来实现的


GDI
COLORREF
的二进制形式由我提供的链接记录,因此您的代码行为是合法的(直到MS更改文档的不太可能的事件发生)

这是因为早在Windows GDI最初设计之后,alpha混合就已经成为绘图功能的一部分。您必须使用相对较新的功能,如(自Windows2000AFAIK以来就存在)来获得该功能

最初,GDI的设计使由
RGB
宏组成的32位颜色值包含类似
0x00bbggrr
的颜色。就像你看到的。。。你认为是alpha通道的比特不是。GDI实际上将这些设置为零。透明度是通过使用遮罩而不是alpha混合来实现的


GDI
COLORREF
的二进制形式由我提供的链接记录,因此您的代码行为是合法的(直到MS更改文档的不太可能的事件发生)

实际上,我使用DIB部分来获得透明度。但是AlphaBlend将所有绘制的对象视为透明的,因为GDI函数将alpha通道设置为0。@sibvic是的,GDI将它们设置为0,因为在GDI文档中,直到今天位都是0(它们不是alpha通道位)。实际上,我使用DIB部分来获得透明度。但是AlphaBlend将所有绘制的对象视为透明对象,因为GDI函数将alpha通道设置为0。@sibvic是的,GDI将它们设置为0,因为在GDI文档中,直到今天,位都是0(它们不是alpha通道位)。