Hi all,
Let me share few codeblocks with you, hoping that someone would se something strange.

Here's method used to draw both opaque and transparent images, I've left only part of code related to transparent bitmap drawing.
Code:
    
void PicturePool::draw(HDC destDC,...)
{
    ...

    // create bitmap, create dc for bitmap, put bitmap in dc
    HBITMAP hBitmap = CreateDIBitmap(destDC, (LPBITMAPINFOHEADER) (p.bmInfo), 
                                     CBM_INIT, lpDIBBits, p.bmInfo, DIB_RGB_COLORS);
    HDC bmpDC = CreateCompatibleDC(destDC);
    HBITMAP hOldBmp = (HBITMAP)SelectObject(bmpDC, hBitmap);

    // create mask, create dc for mask, put mask in dc
    HBITMAP hMask = createTransparentMask(picName, destDC,
                                          width, height,
                                          RGB2LONG(transparentColor),
                                          hBitmap);
    HDC maskDC = CreateCompatibleDC(destDC);
    HBITMAP hOldMask = (HBITMAP)SelectObject(maskDC, hMask);

    ...

    // 1) make transparent parts in bmpDC
    InvertRect(maskDC, &rect);
    BitBlt(bmpDC, 0, 0, width, height, maskDC, 0, 0, SRCAND);

    // 2) put non transparent parts in destDC
    InvertRect(maskDC, &rect);
    BitBlt(destDC, xpos, yDest, width, height, maskDC, 0, 0, SRCAND);

    // 3) put transparent parts in destDC
    BitBlt(destDC, xpos, yDest, width, height, bmpDC, 0, 0, SRCPAINT);

    // cleanup
    if (hBitmap != NULL) { DeleteObject(SelectObject(bmpDC, hOldBmp)); }
    DeleteDC(bmpDC);

    SelectObject(maskDC, hOldMask);  // hMask is not deleted on purpose, it is stored in cache for later use
    DeleteDC(maskDC);    
}

From the code above you see that bitmap mask is created using createTransparentMask method. Here's a code block just in case:

Code:
HBITMAP PicturePool::createTransparentMask(...)
{
    ... 

    HDC hdcMem, hdcMem2;
    HBITMAP maskBitmap = NULL;

    // Create monochrome (1 bit) mask bitmap.
    maskBitmap = CreateBitmap(width, height, 1, 1, NULL);
   
    // Get some HDCs that are compatible with the display driver  
    hdcMem = CreateCompatibleDC(dc);
    hdcMem2 = CreateCompatibleDC(dc);
   
    HBITMAP oldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap);
    HBITMAP oldMask = (HBITMAP)SelectObject(hdcMem2, maskBitmap);
    
    // Set the background color of the color image to the color you want to be transparent.
    SetBkColor(hdcMem, transparentColor);

    // Copy the bits from the color image to the B+W mask... everything with
    // the background color ends up white while everything else ends up black
    BitBlt(hdcMem2, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);

    // Take our new mask and use it to turn the transparent color in our
    // original color image to black so the transparency effect will work right.
    BitBlt(hdcMem, 0, 0, width, height, hdcMem2, 0, 0, SRCINVERT);

    // Clean up.  
    SelectObject(hdcMem, oldBitmap);
    SelectObject(hdcMem2, oldMask);
    DeleteDC(hdcMem);
    DeleteDC(hdcMem2);
    
    ...
}
Now let me explain (or at least try) what seems to be the problem. Code works fine for a certain period of time, then "deadlock" appears on destDC, resulting stuck on following winapi function using that dc and it is always happening after drawing 'somewhat' large bitmap (1024x685, ~2MB).
Simple explanation: draw method executes successfully numerous times, large bitmap (problematic one) is also successfuly displayed numerous times, and than it got stuck on first SelectObject(destDC, anyObject) after draw method. Whole application is displayed 1024x768 pixels, winxp. If I forgot something, I'll add later.

Any suggestion or hint would be really appreciated.