我終於找到了如何做到這一點。這非常棘手。
該解決方案的完整說明可在此處獲得 - winprog.org/tutorial/transparency.html。
這裏的波蘭讀者是great translation。
簡要
簡單的想法:
給予的位圖具有透明部分的外觀是非常簡單的,涉及除採用了黑色和白色口罩圖像來,我們想看看彩色圖像透明。
要使效果正常工作,需要滿足以下條件:首先,彩色圖像在我們想要顯示爲透明的所有區域中必須爲黑色。第二,蒙版圖像必須在我們想要透明的區域爲白色,而在其他地方爲黑色。顏色和蒙版圖像顯示爲此頁面上示例圖片中最左側的兩個圖像。
在簡短簡單的解決方案:
#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;
}
功能,其負責對C reating位掩碼:
HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
HDC hdcMem, hdcMem2;
HBITMAP hbmMask, hbmOld, hbmOld2;
BITMAP bm;
GetObject(hbmColour, sizeof(BITMAP), & bm);
hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
hdcMem = CreateCompatibleDC(NULL);
hdcMem2 = CreateCompatibleDC(NULL);
hbmOld =(HBITMAP) SelectObject(hdcMem, hbmColour);
hbmOld2 =(HBITMAP) SelectObject(hdcMem2, hbmMask);
SetBkColor(hdcMem, crTransparent);
BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);
SelectObject(hdcMem, hbmOld);
SelectObject(hdcMem2, hbmOld2);
DeleteDC(hdcMem);
DeleteDC(hdcMem2);
return hbmMask;
}
我忘了提,'TransparentBlt()'在這個項目中(我不知道爲什麼)禁止。 – 2013-03-10 23:57:40
@ patryk.beza,'BitBlt'也被禁止?如果不是,您可以使用'TransparentBlt'的Wine實現:http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/gdi32/bitblt.c#l827?如果是的話,你如何繪製背景? – Joulukuusi 2013-03-11 10:50:58
我使用未被禁止的BitBlt繪製背景。 – 2013-03-11 22:36:10