2010-02-25 42 views
1

有没有一种方法可以确定HDC是否使用Alpha通道?我读Question 333559Question 685684,但他们的问题是关于BITMAP。显然,某些HDC具有alpha通道(尽管它们可能不会使用它,称为“类型1”),而其他类型则不会(“类型2”)。我通过执行以下操作知道这一点:HDC是否使用alpha通道?

给定一个HDC,

  1. 创建一个兼容的DC,并创建一个DIB部分。将创建的HBITMAP选择到兼容的DC中。

  2. BitBl源HDC到兼容的DC。现在检查DIB部分位。对于类型2的HDC,在每3个字节之后,总有一个字节为0(如255 255 255 0)。对于类型1,这些字节通常是255(如250 240 230 255)。为了避免误报,我在调用之前将这些位memset置于全部0x80。

  3. 直接在源HDC上使用GetDIBits,将HBITMAP指定为GetCurrentObject(hdc,OBJ_BITMAP)。对于这两种类型的HDC,第4个字节总是0.

  4. 通过调用ExtTextOut更改DC位图。对于类型2,ExtTextOut总是将第4个字节设置为0.对于类型1,ExtTextOut始终保持它们不变。

我还注意到,由API创建的源HDC(CreateCompatibleDC(),调用BeginPaint()...)总是型2型。1 HDC是从标准控件(如菜单文本)。即使是类型1的HDC I CreateCompatibleDC也变成了类型2.

所以,一方面,我很沮丧,微软并没有向开发人员提供平等的信息(另一个例子可能是你无法知道方向HBITMAP创建后),另一方面,我仍然想知道是否有办法区分这些HDC。

感谢您的帮助。

回答

0

我只是模仿GDI的行为,现在一切正常。

相关问题