bitmap transparent setzen



  • Da ich immernoch keine richtige Referenz besitze, frage ich also wieder im Forum.

    wie kann ich ein Bild transparent auf ein anderes legen?

    thx

    DjR



  • Geht glaube ich mit AlphaBlt() oder so...



  • ich meine da gab es auch einen Trick mit Regionen...
    (AlphaBlt oder TransparentBlt gibt es erst seit w98se,denke cih)



  • Oder was garantiert immer geht:

    //Microsofts Lösung aus Q79212:
    void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, int xStart, int yStart,
                                COLORREF cTransparentColor)
    {
        BITMAP      bm;
        COLORREF    cColor;
        HBITMAP     hBitAndBack, hBitAndObject, hBitAndMem, hBitSave,
                    hBitBackOld, hBitObjectOld, hBitMemOld, hBitSaveOld;
        HDC         hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
        POINT       ptSize;
    
        hdcTemp = CreateCompatibleDC(hdc);
        SelectObject(hdcTemp, hBitmap);
    
        GetObject(hBitmap, sizeof(BITMAP), &bm);
        ptSize.x = bm.bmWidth;
        ptSize.y = bm.bmHeight;
        DPtoLP(hdcTemp, &ptSize, 1);
    
        hdcBack     = CreateCompatibleDC(hdc);
        hdcObject   = CreateCompatibleDC(hdc);
        hdcMem      = CreateCompatibleDC(hdc);
        hdcSave     = CreateCompatibleDC(hdc);
    
        hBitAndBack     = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);
        hBitAndObject   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0);
    
        hBitAndMem  = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
        hBitSave    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
    
        hBitBackOld     = (HBITMAP)SelectObject(hdcBack, hBitAndBack);
        hBitObjectOld   = (HBITMAP)SelectObject(hdcObject, hBitAndObject);
        hBitMemOld      = (HBITMAP)SelectObject(hdcMem, hBitAndMem);
        hBitSaveOld     = (HBITMAP)SelectObject(hdcSave, hBitSave);
    
        SetMapMode(hdcTemp, GetMapMode(hdc));
        BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
        cColor = SetBkColor(hdcTemp, cTransparentColor);
        BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
        SetBkColor(hdcTemp, cColor);
        BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
        BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp ,0, 0, SRCPAINT);
        BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
        BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);
    
        DeleteObject(SelectObject(hdcBack, hBitBackOld));
        DeleteObject(SelectObject(hdcObject, hBitObjectOld));
        DeleteObject(SelectObject(hdcMem, hBitMemOld));
        DeleteObject(SelectObject(hdcSave, hBitSaveOld));
    
        DeleteDC(hdcMem);
        DeleteDC(hdcBack);
        DeleteDC(hdcObject);
        DeleteDC(hdcSave);
        DeleteDC(hdcTemp);
    }
    

Anmelden zum Antworten