Я, наконец, узнать, как это сделать. Это довольно сложно.
Полное описание решения доступно здесь - 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;
}
Функция, которая отвечает за с ОЗДАНИЕ растровая маска:
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()' запрещен в этом проекте (я не знаю, почему). –
@ patryk.beza, также запрещен ли биттон? Если нет, вы можете использовать реализацию Wine для «TransparentBlt»: http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/gdi32/bitblt.c#l827? Если да, как вы рисуете фон? – Joulukuusi
Я рисую фон с помощью 'BitBlt', который не запрещен. –