TransparentBlt()-Funktion



  • Jochen ... duuuu .... beim nächsten Mal gewinn ich wieder :p 😉

    Greetz :xmas1:



  • 😃



  • Also sin in dem PDSK die neusten Header und Liberies etc. enthalten, die ich dann in meinem Compiler ersetzen muss, hab ich das richtig verstanden?

    und ja, ich benutze den minGW-compiler und möchte ncith umbedingt auf VC++ umsteigen ...



  • Du kannst auch die DrawTransparentBitmap() in deinen
    Quellcode einbinden.
    So hatte ich es mal gemacht, weil die TransparentBlt() nicht
    mit WinXP läuft.
    http://support.microsoft.com/default.aspx?scid=kb;en-us;79212

    Die funktioniert wie die TransparentBlt().

    void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,
                               short yStart, COLORREF cTransparentColor)
       {
       BITMAP     bm;
       COLORREF   cColor;
       HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
       HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
       HDC        hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
       POINT      ptSize;
    
       hdcTemp = CreateCompatibleDC(hdc);
       SelectObject(hdcTemp, hBitmap);   // Select the bitmap
    
       GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
       ptSize.x = bm.bmWidth;            // Get width of bitmap
       ptSize.y = bm.bmHeight;           // Get height of bitmap
       DPtoLP(hdcTemp, &ptSize, 1);      // Convert from device
    
                                         // to logical points
    
       // Create some DCs to hold temporary data.
       hdcBack   = CreateCompatibleDC(hdc);
       hdcObject = CreateCompatibleDC(hdc);
       hdcMem    = CreateCompatibleDC(hdc);
       hdcSave   = CreateCompatibleDC(hdc);
    
       // Create a bitmap for each DC. DCs are required for a number of
       // GDI functions.
    
       // Monochrome DC
       bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
    
       // Monochrome DC
       bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
    
       bmAndMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
       bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
    
       // Each DC must select a bitmap object to store pixel data.
       bmBackOld   = SelectObject(hdcBack, bmAndBack);
       bmObjectOld = SelectObject(hdcObject, bmAndObject);
       bmMemOld    = SelectObject(hdcMem, bmAndMem);
       bmSaveOld   = SelectObject(hdcSave, bmSave);
    
       // Set proper mapping mode.
       SetMapMode(hdcTemp, GetMapMode(hdc));
    
       // Save the bitmap sent here, because it will be overwritten.
       BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
    
       // Set the background color of the source DC to the color.
       // contained in the parts of the bitmap that should be transparent
       cColor = SetBkColor(hdcTemp, cTransparentColor);
    
       // Create the object mask for the bitmap by performing a BitBlt
       // from the source bitmap to a monochrome bitmap.
       BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
              SRCCOPY);
    
       // Set the background color of the source DC back to the original
       // color.
       SetBkColor(hdcTemp, cColor);
    
       // Create the inverse of the object mask.
       BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
              NOTSRCCOPY);
    
       // Copy the background of the main DC to the destination.
       BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,
              SRCCOPY);
    
       // Mask out the places where the bitmap will be placed.
       BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
    
       // Mask out the transparent colored pixels on the bitmap.
       BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
    
       // XOR the bitmap with the background on the destination DC.
       BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
    
       // Copy the destination to the screen.
       BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0,
              SRCCOPY);
    
       // Place the original bitmap back into the bitmap sent here.
       BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);
    
       // Delete the memory bitmaps.
       DeleteObject(SelectObject(hdcBack, bmBackOld));
       DeleteObject(SelectObject(hdcObject, bmObjectOld));
       DeleteObject(SelectObject(hdcMem, bmMemOld));
       DeleteObject(SelectObject(hdcSave, bmSaveOld));
    
       // Delete the memory DCs.
       DeleteDC(hdcMem);
       DeleteDC(hdcBack);
       DeleteDC(hdcObject);
       DeleteDC(hdcSave);
       DeleteDC(hdcTemp);
       }
    

    Aufruf:

    DrawTransparentBitmap(hdc,         // The destination DC.
    
                             hBitmap,     // The bitmap to be drawn.
                             xPos,        // X coordinate.
                             yPos,        // Y coordinate.
                             0x00FFFFFF); // The color for transparent
                                          // pixels (white, in this
                                          // example).
    


  • Das Selbe passiert mit der "DrawTransparentBitmap"-Funktion, also genau der Selbe Fehler, trotzdem THX!



  • Hast Du WINVER auf 0x0400 gesetzt?
    Folgendes lässt sich bei mir ohne Probleme übersetzen:

    #define WINVER 0x0400
    #include <windows.h>
    #include <tchar.h>
    int _tmain()
    {
      TransparentBlt(NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 0);
    }
    


  • Und das PSDK dürfte folgendes sein:
    http://www.microsoft.com/downloads/details.aspx?FamilyID=eba0128f-a770-45f1-86f3-7ab010b398a3&DisplayLang=en

    Einfach downloaden, installieren, die Pfade in deinem Compiler setzen und glücklich sein.

    Greetz :xmas2:



  • Hast du die DrawTransparentBitmap() denn so wie ich sie gepostet habe
    in deinen Quellcode eingesetzt?
    Also den kompletten Code als eigene Funktionsdefinition.



  • Hast du die DrawTransparentBitmap() denn so wie ich sie gepostet habe in deinen Quellcode eingesetzt? Also den kompletten Code als eigene Funktionsdefinition.

    Ja, dann später :D, aber mein compiler hat rumgemeckert bei der Zeile
    bmBackOld = SelectObject(hdcBack, bmAndBack);
    von wegen er könne von "void*" nciht nach "hBITMAP*" konvertieren ...

    ich nehm das PDSK:
    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
    weil bei dem anderen gabs ne Fehlermeldung bei der Installation ...
    ich bin ncoh beim downloaden, mal schauen ...

    @ Jochen, dann kommt auchdie ganz oben genannte Meldung ..



  • Ja, stimmt, du mußt noch für den MingW eine Typecasting vornehmen.

    bmBackOld   = (HBITMAP)SelectObject(hdcBack, bmAndBack);
    bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject);
    bmMemOld    = (HBITMAP)SelectObject(hdcMem, bmAndMem);
    bmSaveOld   = (HBITMAP)SelectObject(hdcSave, bmSave);
    

    Dann läufts aber.
    Für den Fall, daß das PDSK nicht läuft.
    Ich ziehe es auch gerade..



  • Danke!
    so, k, jetzt meckert mein Compiler nicht bei der Funktion, aber irgendwie wird dabei ein schwarzes rechteck auf dem Bildschirm ausgeruckt, anstatt eins, wo ein Teil transparent ist ...

    und das SDK hab ich jetzt, ich werde mal die ein bissl kopieren und einfügen und mal schauen, wieviel ich kaputt mache 😃



  • Dann haste wahrscheinlich die falsche Bitmap übergeben oder
    eine falsche Transparenzfarbe.
    Wenn du ein praktisches Beispiel brauchst, kann ich dir gerne
    nochmal eines posten.
    Bei mir hat es gut funktioniert und ich kann
    eine Bitmap transparent auf eine andere Bitmap draufblitten.

    Aber teste erstmal das PDSK.
    Ich werde es auch gleich mal durchtesten.



  • Hm, also das mit dem "einfachen" kopieren hat schonmal garnicht geklappt, beim compilieren von simpelsten Anwendungen kommen 100 Fehlermeldungen mit irgendwelchen includefiles, also genau da, wo ich was verändert hab ...

    ich hab den kompletten inhalt aus "Include" und "Lib"`kopiert und gegenfalls ersetzt oder halt einfach hinzugefügt, aber das funzt garnciht ...

    mit der anderen FunktION muss ich später mal gucken welchen hdc ich nehmen muss etc.



  • Nicht, dass meine andere Frage geklärt wäre, aber gibt es eine Möglichkeit statt BITMAPS .gif-Bilder zu laden und deren Transparents gleich zu übernehmen?

    THX



  • Nur mal so ne kleine Frage für Zwischendurch: Hast du schon mal was von GDI+ gehört? Lässt sich ziemlich leicht verwenden und ist IMO für deine Zwecke genau das richtige. Such einfach mal bei MS.

    Greetz :xmas1:



  • Naja, aber ich kann mir nciht vorstellen, dass mein Kompiler diese Funktionen akzeptiert, wenn er schon bei GDI-Funktionen streikt ...

    Könntest du mal ein kurzes Bsp. schreiben, wo ein paar dieser Funktionen enthalten sind, damit ich mal gucken kann, was mein Compiler macht?



  • Junge, nimm Visual C++ 2005 Express + Platform SDK und deine Sorgen haben ein Ende.



  • Na in deinem PSDK werden die wohl kaum dabei sein, wenn er schon bei TransparentBlt bockt ... deswegen hör auf den Kollgen mit dem vielsagenden Nickname und installier dir die Express-Edition!

    Bsp:

    Image img = new Image("C:\\Test.jpg");
    

    --> an Includes / Libs denken (siehe MSDN)

    Greetz :xmas1:



  • Dazu brauch ich aber dieses ******* SP2 für WinXP und damit hab ich GANZ schlecht erfahrungen gemacht und auf Datensichern und evtl. Neuinstallation vom BS hab ich garkeinen Bock ...
    aber wenns nciht anders geht ...

    Benutzt denn von euch keiner den MinGW-Compiler?



  • SP2 ist gut.


Anmelden zum Antworten