transparenter hintergrund von bitmap



  • hi.
    ich bins mal wieder.
    ich arbeite mit der win-ce api.
    ich würde gern wissen wie man es hinbekommt,
    das der hintergrund einer auf einem button geladenen bitmap transparent wird.
    selbstverständlich ist der hintergrund der bitmap einfarbig.



  • Hier mal meine Version:

    HBITMAP CreateMask(HBITMAP hBmpSrc, COLORREF clTransparent)
    {
       HBITMAP   hBmpMask, hBmpOldMask, hBmpOldSrc;
       BITMAP    bm;
       HDC       hdcMask = CreateCompatibleDC(NULL);
       HDC       hdcSrc = CreateCompatibleDC(NULL);
       COLORREF  clPrev;
    
       if(!hBmpSrc)
          return NULL;
    
       // Create mask bitmap
       GetObject(hBmpSrc, sizeof(BITMAP), &bm);
       hBmpMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
    
       // Select bitmaps into DCs
       hBmpOldMask = (HBITMAP)SelectObject(hdcMask, hBmpMask);
       hBmpOldSrc = (HBITMAP)SelectObject(hdcSrc, hBmpSrc);
    
       // Blit source dc into mask dc
       clPrev = SetBkColor(hdcSrc, clTransparent);
       BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSrc, 0, 0, SRCCOPY);
       SetBkColor(hdcSrc, clPrev);
    
       // Clean up
       SelectObject(hdcMask, hBmpOldMask);
       SelectObject(hdcSrc, hBmpOldSrc);
       DeleteObject(hdcMask);
       DeleteObject(hdcSrc);
    
       return hBmpMask;
    }
    //---------------------------------------------------------------------------
    
    VOID TransparentBlt(HDC hdcDest,
                        int nXDest,
                        int nYDest,
                        int nWidth,
                        int nHeight,
                        HDC hdcSrc,
                        int nXSrc,
                        int nYSrc,
                        HBITMAP hBmpMask,
                        COLORREF rgbTransparent)
    {
       HDC hdcMask = CreateCompatibleDC(NULL);
       HBITMAP hBmpOldMask = (HBITMAP)SelectObject(hdcMask, hBmpMask);
    
       BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCINVERT);
       BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcMask, nXSrc, nYSrc, SRCAND);
       BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCINVERT);
    
       SelectObject(hdcMask, hBmpOldMask);
       DeleteDC(hdcMask);
    }
    

    Also erst per CreateMask() eine Maske erstellen und dann TransparentBlt() benutzen. Ich muss mich allerdings rügen, denn dieses Vorgehen ist nicht sehr schnell. Vielleicht findest du ja noch was anderes. Hauptsache, es funktioniert. 🙂

    [ Dieser Beitrag wurde am 08.04.2003 um 02:18 Uhr von WebFritzi editiert. ]



  • // Clean up
       DeleteObject(hdcMask);
       DeleteObject(hdcSrc);
    

    Und wo holst Du in Deinem 'Clean Up' die Objecte aus dem DC heraus?

    BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCINVERT);
       BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcMask, nXSrc, nYSrc, SRCAND);
       BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCINVERT);
    

    Ist da nicht ein BitBlt zuviel?

    SelectObject(hdcMask, (HBITMAP)NULL);
    

    Diesen Trick musst Du mir genauer erklären.

    [ Dieser Beitrag wurde am 07.04.2003 um 12:25 Uhr von -King- editiert. ]



  • mein hintergrund (also der der an der stelle vom transparentren dann dargestellt werden soll) ist aber mehrfarbig.
    auserdem ist das schon ziemlich rechenlastig,
    vor allem bei PDA's kommt so etwas dann voll zum tragen.
    hat einer vieleicht noch ne idee???



  • @-King-: Is jetzt so besser mit den DCs? Hab den Beitrag editiert.

    Ist da nicht ein BitBlt zuviel?

    Nö, wieso? 😕

    @<Andre>:

    mein hintergrund (also der der an der stelle vom transparentren dann dargestellt werden soll) ist aber mehrfarbig.

    Hä? Versteh ich nicht. Welchen Hintergrund meinst du jetzt?
    Den im Bitmap?
    - Der sollte schon einfarbig sein!
    Oder den, auf den das Bitmap transparent gemalt werden soll?
    - Der kann millionenfarbig sein. Ist völlig egal.

    [ Dieser Beitrag wurde am 08.04.2003 um 02:25 Uhr von WebFritzi editiert. ]


Anmelden zum Antworten