2

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

给定一个 HDC,

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

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

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

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

我还注意到由 API(CreateCompatibleDC()、BeginPaint() ...)创建的源 HDC 始终是类型 2。类型 1 HDC 来自标准控件(如菜单文本)。甚至 HDC I CreateCompatibleDC 从类型 1 变为类型 2。

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

感谢帮助。

4

1 回答 1

0

I just mimic GDI's behavior and everything works fine now.

于 2010-05-30T05:15:09.457 回答