BitBlt() - Bildfehler



  • Hallo Leute,

    ich habe folgenden Code für die Animation:

    hdc = GetDC(hwnd);
    hdc_buffer = CreateCompatibleDC(hdc);
    hdc_mem = CreateCompatibleDC(hdc_buffer);
    
    hbmp_back = CreateCompatibleBitmap(hdc_buffer,rcClient.right,rcClient.bottom);
    hbmp_old1 = SelectObject(hdc_buffer,hbmp_back);
    FillRect(hdc_buffer,&rcClient,(HBRUSH)GetStockObject(WHITE_BRUSH));
    
    hbmp_old2 = SelectObject(hdc_mem,stan.hbmp_stan);	
    BitBlt(hdc_buffer,stan.x,stan.y,bmp.bmWidth,bmp.bmHeight ,hdc_mem,0,0,SRCCOPY);
    
    BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdc_buffer,0,0,SRCCOPY);
    
    SelectObject(hdc_buffer,hbmp_old1);
    SelectObject(hdc_mem,hbmp_old2);
    ReleaseDC(hwnd,hdc);
    

    Dummerweise, ist das nun kein Bild vom Stan, das da angezeigt wird, sondern
    ein schwarzer Kasten mit ein paar weißen Punkten drin.

    Wenn ich nur

    GetDC() - SelectObject(hdc_mem,object) - BitBlt(hdc,stan.x,stan.y,stan.width,stan.height,hdc_mem,SRCCOPY) - ReleaseDC(hdc)
    

    nutze, funzt die Animation, nur halt, dass das Bild von Stan Schlieren zieht. (Klar wenn der Hintergrund nich übermalt wird)

    Kann mir jemand sagen, warum das so ist?!
    Ich habe schon andere Flags bei BitBlt ausprobiert, hilft aber nicht wirklich.
    MfG



  • Mal abgesehen davon daß dieser Beitrag eigentlich ins WinAPI Forum gehöhrt:

    Hast du den Code im Messageloop unter WM_PAINT:?

    bzw. in welchen intervallen wird geblittet?



  • Oh, verflucht. Ich dachte, ich hätte unter WinAPI geposted. 🙄
    Sorry.

    Der zitierte Code befindet sich in einem "case WM_TIMER:", das alle 50ms
    ausgeführt wird.

    hbmp_old = (HBITMAP) SelectObject(hdc_mem,stan.hbmp_stan);	
    		BitBlt(hdc_buffer,0,0,bmp.bmWidth,bmp.bmHeight ,hdc_mem,0,0,SRCCOPY);
    
    		BitBlt(hdc,x,y,bmp.bmWidth,bmp.bmHeight ,hdc_buffer,0,0,SRCCOPY);
    

    Also, nichtmal dieses funktioniert! Was mache ich beim Double Buffering falsch?!
    Ohne DB gehts ja, flimmert halt nur doof. 😕

    Danke, für die Hilfe.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich binn zwar auch nicht der Experte, mach jetzt erst seit ca. 3 Monaten mit der
    WinAPI rum.
    Würde aber empfehlen unter WM_TIMER den bereich der zu zeichnen ist mit InvalidateRect ungültig zu machen, und unter WM_PAINT zu zeichnen.
    Dann solltest du mal probieren dinen DC mit BeginPaint zu erhalten (natürlich nur beim empfangen von WM_PAINT). Ich hatte auch schon komische ergebnisse wenn ich mit GetDC gearbeitet hab.



  • Du musst das CreateCompatibleBitmap immer mit dem richtigen DC aufrufen (also hdc statt hdc_buffer), da der Memory DC nach dem erstellen immer Schwar-Weiß ist.



  • flenders schrieb:

    Du musst das CreateCompatibleBitmap immer mit dem richtigen DC aufrufen (also hdc statt hdc_buffer), da der Memory DC nach dem erstellen immer Schwar-Weiß ist.

    Jo, daran hat es gelegen. Ich glaube ich muss mich noch ein wenig in GDI einlesen.
    Kennt ihr da noch andere gute Quellen außer der MSDN?

    VIELEN DANK EUCH ALLEN!


Anmelden zum Antworten