2017-05-27 205 views
1

在阅读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运算符结合了源和目标矩形的颜色。”)

这是我所看到的视觉: enter image description here

总体来说,我想知道,在按位级别,窗口中的句柄与设备上下文之间的比较以及白/黑图像之间的比较是什么,导致结果中的白色消失,黑色保持不变?

我认为会发生的是,在开始时,设备上下文的句柄只包含0。所以不管什么颜色都会AND'd,和0一起做结果总是0,所以最后一切都会变黑,导致黑色方块。

+0

我们需要使用['AlphaBlend'](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183351(v = vs.85).aspx) – RbMm

回答

2

SRCAND的文档说它“通过使用布尔AND运算符将源和目标矩形的颜色组合在一起。”

更准确地,按位 AND运算时使用。

目标像素总是灰色的(假设RGB值为0x7F7F7F)。对于源图像中的白色像素,像素值将为0xFFFFFF,黑色像素为0x000000

这导致下面的等式如果源像素是黑色

DWORD result = 0x000000 & 0x7F7F7F; 

结果是0x000000(黑色),因为,只保留其是在1操作数比特。

如果源像素是白色我们有下列公式:

DWORD result = 0xFFFFFF & 0x7F7F7F; 

结果是0x7F7F7F(灰色),因为这些是在1操作数的比特。

+0

嘿,谢谢,那是一个非常好的答案。 – DragonautX

相关问题