В hBitmap — исходный цветной рисунок, с маской RGB(255,0,255)
В hDC — должны получить результирующее изображение.
HDC hMemDc = ::CreateCompatibleDC(hDc);
HDC hSrcDC = ::CreateCompatibleDC(hDc);
int cx = rect.Width();
int cy = rect.Height();
// create mono or color bitmap
HBITMAP hBm = ::CreateBitmap(cx, cy, 1, 1, NULL);
HBITMAP hOldBitmap1 = (HBITMAP)::SelectObject(hMemDc, hBm);
::PatBlt(hMemDc, 0, 0, cx, cy, WHITENESS);
BITMAP b;
GetObject(hBitmap, sizeof(BITMAP),(LPSTR)&b);
HBITMAP hOldBitmap2 = (HBITMAP)::SelectObject(hSrcDC, hBitmap);
::TransparentBlt(hMemDc,
0,
0,
cx,
cy,
hSrcDC,
0,
0,
b.bmWidth,
b.bmHeight,
RGB(255, 0, 255));
::BitBlt(hDc, rect.left, rect.top, cx, cy, hMemDc, 0, 0, SRCCOPY);
::SelectObject(hMemDc, hOldBitmap1);
::ReleaseDC(0, hMemDc);
::SelectObject(hSrcDC, hOldBitmap2);
::ReleaseDC(0, hSrcDC);
...
Получается странный эффект зеркалирования. От чего он взялся и как от него избавиться?
Рисунок:
здесь
Меняю
::TransparentBlt(hMemDc,
0,
0,
cx,
cy,
hSrcDC,
0,
0,
b.bmWidth,
b.bmHeight,
RGB(255, 255, 255));
на
::BitBlt(hMemDc, 0, 0, cx, cy, hSrcDC, 0, 0, SRCCOPY);
и зеркалирование пропадает. Но надо выводить с маской. Как быть?
E>и зеркалирование пропадает. Но надо выводить с маской. Как быть?
TransparentBlt does not mirror a bitmap if either the width or height, of either the source or destination, is negative.
А с учетом того, что эта функция еще и "протекает" на 9х — лучше ее не пользовать вообще. Можно посоветовать посмотреть реализацию оной у юаня, либо
Q79212 и
Q97365.