Я использую :: TransparentBlt для рисования bmp с прозрачными пикселями, отмеченными Magenta RGB (255, 0, 255), но :: TransparentBlt не ведет себя правильно, некоторые пиксели, которые не должны быть прозрачными, прозрачны в результате.
Что я делаю не так?
Оригинальное изображение:
Результат от :: TransparentBlt
Серая область в изображении результата - фоновое изображение, поверх которого исходный бит: :: TransparentBlt-ed
Код:
LRESULT jItems::paint ( )
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
::GetClientRect ( hwnd , &rect ) ;
hdc = ::BeginPaint ( hwnd , &ps ) ;
HDC dcSkin = ::CreateCompatibleDC ( hdc ); // memory dc for skin
HDC hMemDc = ::CreateCompatibleDC ( hdc ); // memory dc for painting
HBITMAP hmemBmp = ::CreateCompatibleBitmap ( hdc, rect.right - rect.left, rect.bottom - rect.top ); // Create bitmap to draw on
HBITMAP hOldMemBmp = ( HBITMAP ) ::SelectObject ( hMemDc, hmemBmp ); // select memory bitmap in memory dc
HBITMAP hOldSkinBmp = ( HBITMAP ) ::SelectObject ( dcSkin, this->hbitmap ); //select skin bitmap in skin memory dc
::FillRect ( hMemDc, &rect, ::CreateSolidBrush ( backgroundColor ) );
::BitBlt ( hMemDc, 0, 0, rect.right - rect.left,
rect.bottom - rect.top, dcSkin, 0, 0, SRCCOPY ); // Paint Skin on Memory DC
::SelectObject ( dcSkin, bottomEdge ); // select edge bitmap in skin memory dc
::TransparentBlt ( hMemDc, 0, 0, rect.right - rect.left,
rect.bottom - rect.top, dcSkin,
0, 0, 237, 10, RGB ( 255, 0, 255 ) ); // Paint edge on Memory DC
::BitBlt ( hdc, 0, 0, rect.right - rect.left,
rect.bottom - rect.top, hMemDc, 0, 0, SRCCOPY ); // Paint Skin on Window DC
//<<<... DeleteDC will leak memory if it holds a resource, so lets select the old bitmap back in the memory DCs
::SelectObject ( hMemDc, hOldMemBmp ); // select old bitmaps back to their respective DCs before deleting
::SelectObject ( dcSkin, hOldSkinBmp ); // select old bitmaps back to their respective DCs before deleting
::DeleteObject ( hOldSkinBmp );
::DeleteObject ( hOldMemBmp );
::DeleteObject( hmemBmp );
::DeleteDC ( hMemDc );
::DeleteDC ( dcSkin );
::EndPaint ( hwnd , &ps ) ;
return 0;
};
Из документации TransparentBlt.
Если исходный и целевой прямоугольники не имеют одинакового размера, то растровое изображение источника растягивается в соответствии с прямоугольником назначения.
При вызове TransparentBlt прямоугольник назначения имеет размер (rect.right - rect.left, rect.bottom - rect.top), а исходный прямоугольник имеет размер (237, 10). Таким образом, растровое изображение растянуто, и вы не получите ожидаемого результата.
Думаю, оба размера должны быть (237, 10).