在阅读Windows API的Forger's "Transparent Bitmaps"教程之后,我无法理解BitClt()函数与SRCAND在位级别。Bitblt()如何与SRCAND一起使用?
根据教程,我用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。所以不管什么颜色都会AND'd,和0一起做结果总是0,所以最后一切都会变黑,导致黑色方块。
我们需要使用['AlphaBlend'](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183351(v = vs.85).aspx) – RbMm