【发布时间】:2017-05-27 17:46:27
【问题描述】:
在阅读了 Forger 的 Windows API 的 "Transparent Bitmaps" 教程后,我在按位理解 SRCAND 的 Bitblt() 函数时遇到了麻烦。
根据教程,我使用 SRCAND 绘制单个黑白位图的部分代码如下所示。
BITMAP bm;
RECT rcClient;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); //hwnd = handle to current window
HDC hdcMem = CreateCompatibleDC(hdc);
GetObject(g_hbmBall, sizeof(bm), &bm); //g_hbmBall = handle to bitmap object
GetClientRect(hwnd, &rcClient);
FillRect(hdc, &rcClient, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
SelectObject(hdcMem, g_hbmBall);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCAND);
我很困惑的是最后一行,如何使用按位与,位图图像的白色在结果中消失,而黑色保持在那里。 (SRCAND 的文档说它“使用布尔 AND 运算符组合源矩形和目标矩形的颜色。”)
总的来说,我想知道,在按位级别,在窗口中的设备上下文句柄和白色/黑色图像之间进行比较以导致白色在结果中消失而黑色保持不变?
我认为会发生的是,一开始,设备上下文的句柄只包含 0。所以不管是什么颜色,用 0 做 AND 总是得到 0,所以最后一切都是黑色的,结果是一个黑色的方块。
【问题讨论】:
-
为了透明度,我们需要使用
AlphaBlend -
AlphaBlend 很聪明,但速度要慢 4 倍(我只是在调整绘图功能的性能......)。使用 GDI+ 更智能、更慢
标签: winapi