TransparentBlt()-Funktion



  • 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.



  • #define WINVER 0x0500
    
    #include <windows.h>
    


  • Nagut, dann werd ich`s wohl mal angehen, auch wenn ich keine Bock hab ...

    @Don Carsto, du wolltest mir ein einfaches Bsp. zeigen, ich würde jetzt darauf zurückgreifen ...



  • Top-se schrieb:

    Nagut, dann werd ich`s wohl mal angehen, auch wenn ich keine Bock hab ...

    Keiner zwingt dich 😉

    Greetz :xmas1:



  • Okay, versuche es ungefähr so einzubinden.
    Für eine Fensterauflösung von 800x600 Pixel.
    Musst natürlich noch deinen Code ein wenig anpassen.
    --> HINSTANCE hinst; und HWND hwnd;

    HDC hdc;         
    HDC buffer;      
    HDC hdc1;
    HBITMAP bbuffer; 
    HBITMAP sprite;  
    HBITMAP bmap;
    
    sprite = (HBITMAP)LoadImage(hinst,"sprite.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
    bmap = (HBITMAP)LoadImage(hinst,"hintergrund.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    bbuffer = (HBITMAP)LoadImage(hinst,"hintergrund.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
    hdc = GetDC(hwnd);                  
    hdc1 = CreateCompatibleDC(hdc);
    SelectObject(hdc1,bmap);
    buffer = CreateCompatibleDC(hdc);   
    SelectObject(buffer,bbuffer);  
    
    BitBlt(buffer,0,0,800,600,hdc1,0,0,SRCCOPY); 
    //hier wird nun der Hintergrund in den buffer geschrieben.
    DrawTransparentBitmap(buffer,sprite,100,300,RGB(110,80,52)); 
    //hier das sprite in den buffer geschrieben. 
    //die farbe RGB(110,80,52) wird transparent gezeichnet. 
    //position des sprites ist x100 y300.
    BitBlt(hdc,0,0,800,600,buffer,0,0,SRCCOPY); 
    //hier dann der komplette buffer in das fenster-hdc geschrieben. 
    //dann kann das ganze ab dem ersten BitBlt mit anderen positionen 
    //des sprites wiederholt werden.
    

    Durch das Buffering flackert das Sprite dann nicht, wenn es
    sehr schnell bewegt wird.

    Gruß,
    DC



  • Mercy beaucoup!

    Also das funzt einwandfrei, jetzt muss ich nurnoch gucken, wo der Unterschied zu meinem ist ...

    THX!



  • So, jetzt hab ich mir dieses SP2 und Visual C++ geladen und installiert und gestartet ...

    nachdem ich meinen Code ein bissl angepasst hab tritt beim Linker-Vorgang ein Fehler auf:
    TestWinAPI.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__TransparentBlt@44

    woran kann das liegen? Ich hab das aktuelle SDK noch cniht eingebunden, weil ich mir nciht sicher bin, wie ich das genau machen soll, kann es dann dadran liegen, oder gibts nen anderen Grund? braucht ihr meinen Code?




Anmelden zum Antworten