c++ - 使用 AlphaBlend() 和 FillRect()

标签 c++ winapi gdi

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

可以,但是有问题。每当我使用 FillRect() 函数时,HBITMAP 中的 alpha 值都会猛烈地变为 0。每次。

因此,在每次调用 FillRect() 等 Win32 API 函数后,我必须执行 GetDIBits(),将 alpha 重置回 255,然后执行 SetDIBits()。

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

最佳答案

除了 AlphaBlend...BitBlt 是唯一一个以任何方式保留 alpha channel 的其他 GDI 函数。

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

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

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

关于c++ - 使用 AlphaBlend() 和 FillRect(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853584/

相关文章:

c++ - 在 C++14 中使用 auto 实现非类型模板参数

c - 超时后如何关闭上下文菜单?

c++ - Bmp 图像在使用 gdi32 的控制台滚动一段时间后消失

winapi - 在 GDI 中旋转矩形

c++ - 如何找出DC的尺寸?

c++ - 将数据提供给 ChartView (LineSeries) - QML

c++ - to_address 的具体用例

c++ - 将布局映射到内存地址

c++ - 通过旧的(非 wchar)API 函数在非 ANSI 系统上打开文件

c - 为什么给 ReadFileEx() 的回调没有收到正确的 OVERLAPPED 结构?