我终于找到了如何做到这一点的方法。 这相当棘手。
完整的解决方案描述在这里 - winprog.org/tutorial/transparency.html。
对于波兰读者,在这里有伟大的翻译。
简要说明:
使位图具有透明部分的外观非常简单,只需使用黑白掩码图像以及我们想要看起来透明的颜色图像即可。
为了使效果正常工作,必须满足以下条件:首先,所有希望显示为透明的区域的颜色图像必须为黑色。其次,在我们希望透明的区域中,掩码图像必须为白色,其他地方则为黑色。颜色和掩码图像显示为此页面上最左侧的两个图像。
简要解决方案:
#define TRANSPARENCY_COLOR RGB(0, 255, 255)
birdBmp = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
hbmpMask = CreateBitmapMask(birdBmp, TRANSPARENCY_COLOR);
绘画:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
HDC birdMaskHdc = CreateCompatibleDC(hdc);
BITMAP bmInfo;
GetObject(birdBmp, sizeof(bmInfo), &bmInfo);
HBITMAP hbmpOld = (HBITMAP) SelectObject(birdMaskHdc, hbmpMask);
BitBlt(hdc, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, birdMaskHdc, 0, 0, SRCAND);
SelectObject(birdMaskHdc, birdBmp);
BitBlt(hdc, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, birdMaskHdc, 0, 0, SRCPAINT);
SelectObject(birdMaskHdc, hbmpOld);
DeleteDC(birdMaskHdc);
EndPaint(hWnd, &ps);
break;
}
清理:
case WM_DESTROY:
{
DeleteObject(hbmpMask);
DeleteObject(birdBmp);
PostQuitMessage(0);
break;
}
创建位图掩码的函数:
HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
TransparentBlt()
是被禁止的(我不知道为什么)。 - patryk.bezaBitBlt
也被禁止了吗?如果没有,您可以使用Wine实现的TransparentBlt
:http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/gdi32/bitblt.c#l827?如果是,您如何绘制背景? - skinkBitBlt
绘制背景,这是不被禁止的。 - patryk.beza