使用 AlphaBlend() 和 FillRect()

bob*_*obo 3 c++ winapi gdi

所以,我使用AlphaBlend () 将一个矩形从一个 HBITMAP 复制到另一个。

它有效,但有一个问题。每当我使用 FillRect() 函数时,HBITMAP 中的 alpha 值都会被猛击为 0。每次。

因此,在每次调用诸如 FillRect() 之类的 Win32 api 函数之后,我必须 GetDIBits(),将 alpha 重置回 255,然后是 SetDIBits()。

那么,有没有办法创建 HBRUSH 或以其他方式告诉 FillRect() 不要触摸它要绘制到的 HBITMAP 中的 alpha 通道值?

Chr*_*cke 5

除了 AlphaBlend...BitBlt 是唯一可以以任何方式保留 Alpha 通道的其他 GDI 函数。

因此,您的选择基本上是:

  1. 切换到使用 DIBSections。这不会解决 GDI api 覆盖 alpha 通道的基本问题,但作为 DIBSection,您可以避免修补 alpha 通道所需的昂贵的 DDB -> DIB -> DDB 转换。DIBSections 使您可以访问 HBITMAP 和存储位图位的内存部分。

  2. 使用像GdiPlus这样的 alpha 感知绘画 API而不是 GDI。