:: TransparentBlt не работает должным образом

0

Я использую :: TransparentBlt для рисования bmp с прозрачными пикселями, отмеченными Magenta RGB (255, 0, 255), но :: TransparentBlt не ведет себя правильно, некоторые пиксели, которые не должны быть прозрачными, прозрачны в результате.

Что я делаю не так?

Оригинальное изображение:

Изображение 174551

Результат от :: TransparentBlt

Изображение 174551

Серая область в изображении результата - фоновое изображение, поверх которого исходный бит: :: 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;
};
Теги:
winapi

1 ответ

5
Лучший ответ

Из документации TransparentBlt.

Если исходный и целевой прямоугольники не имеют одинакового размера, то растровое изображение источника растягивается в соответствии с прямоугольником назначения.

При вызове TransparentBlt прямоугольник назначения имеет размер (rect.right - rect.left, rect.bottom - rect.top), а исходный прямоугольник имеет размер (237, 10). Таким образом, растровое изображение растянуто, и вы не получите ожидаемого результата.

Думаю, оба размера должны быть (237, 10).

  • 0
    Ага спасибо, разобрался;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню