TransparentBlt - einfaches beispiel?



  • Hallo,

    ich will ein Bitmap darstellen.. derzeit mach ich das mit bitblt.

    Nun will ich aber, dass die Farbe RGB 0,0,0 nicht angezeigt wird (also transparent ist.
    Dazu kann man ja TransparentBlt verwenden.

    aber die beispiele die ich im netz gefunden habe, schnall ich rigendwie nciht, weil so viel aussenrum noch zusätzlich gebaut wurde.. .

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_2y9g.asp
    irgendwie raff ichs net

    kann ich "einfach" das bitblt durch TransparentBlt ersetzen?

    kann mir bitte jemand ein wirklcih simples beispiel dazu mal posten?

    das Bitmap lade ich derzeit per LoadImage.

    vielen Dank
    viele Grüße
    Edwart



  • Hi,
    also schwarz würde ich nicht gerade als tranzparente Farbe wählen. Nimm eine die weniger oft vor kommt, z.B. lila ( 255, 0, 255 );
    Du mußt noch eine s/w Maske des Bitmaps erstellen.
    Also mit CreateBitmap.
    Dort setzt Du die Hintergrundfarbe (SetBkColor) auf lila.

    Beim eigentlichen blitten sind 3 Vorgänge notwendig:

    COLORREF oldBack = SetBkColor( originalbitmap, COLORREF(RGB(255,0,255)) );
    BitBlt( originalbitmap, SRCINVERT );
    BitBlt( bitmapmaske, SRCAND );
    BitBlt( originalbitmap, SRCINVERT );
    SetBkColor( originalbitmap, oldBack );

    Du kannst aber auch gerne mal hier schauen:
    http://home.arcor.de/ksros/gfxlib

    Da brauchste Dich um solche Dinge nicht mehr zu kümmern.

    C ya



  • hallo,

    vielen Dank für die Antwort.
    Werde das mal heute ausporbieren... 😉

    Der Tip mit der gfxlib ist gar nicht schlecht... . vereinfacht sowas ziemlich 😉



  • Habs hinbekommen.. jibbi 😉

    für den fall das jemand vor dem gleichen problem steht, anbei meinen Code der bei mir funktioniert 🙂

    case WM_CREATE:
                  Animwnd = (HBITMAP)LoadImage(0,"explosion1.bmp",IMAGE_BITMAP, 0, 0,
                     LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_LOADTRANSPARENT); 
         return 0;
    
    case WM_PAINT:
             hdcAnim = BeginPaint (hwnd, &psAnim) ;
             hdcMemAnim = CreateCompatibleDC (hdcAnim) ;
             SelectObject (hdcMemAnim, Animwnd);
             TransparentBlt (hdcAnim, 0, 0, 65, 70, hdcMemAnim,0, 0,64,64, RGB(255,0,255) ) ;
             EndPaint (hwnd, &psAnim) ; 
         return 0;
    

    vielen dank für die Hilfe
    viele grüße
    Edwart



  • Schön 🙂

    Aber, daß Dein Code im Paintbereich einen Overkill verursacht weißt Du?
    Du erstellst, bei jeder Paint-Nachricht, ein neues DeviceContext.
    Doch nichts weit und breit wo Du es wieder freigibst.

    Also ein
    DeleteDC( hdcMemAnim );
    tut not!

    CU



  • FlanDerZ schrieb:

    einen Overkill

    Raumpatrouille Orion?

    Bye, TGGC (Ein Jahr Helden)



  • TGGC schrieb:

    FlanDerZ schrieb:

    einen Overkill

    Raumpatrouille Orion?

    Bye, TGGC (Ein Jahr Helden)

    Nein, er meint so was wie dich. Du verursacht auch einen Overkill mit deinen überflüssigen Antworten. 😉 😮



  • hab das
    hdcMemAnim = CreateCompatibleDC (hdcAnim) ;
    jetzt ins 'WM_CREATE' geschoben.. da sollte es ja eigentlich nur einmal erstellt werden, oder?
    Weil das Fenster wird ja nur einmal gebaut!


Anmelden zum Antworten