BackBuffer für Grafik ohne DirectX



  • Hallo,

    kann man eigentlcih den "ominösen" BackBuffer auch ohne DirectX verwenden?

    Derzeit zeichne ich alle Pics einzeln per BitBlt auf den Monitor, dadurch wird jedes Bild einzeln nacheinander angezeigt -> Bildaufbau ist sichbar.

    Nun will ich über den BackBuffer erst alles im "Hintergrund" zeichenen und dann auf dem monitor anzeigen lassen. Das ganze nach möglichkeit ohne DirectX.

    Geht das überhaupt? Falls ja - wie?

    Vielen Dank für Eure Tips und Hilfe
    Grüße
    Edwart



  • SwapBuffers() ist eine WinAPI-Funktion..

    Wie sie allerdings genau in Hinblick auf WinAPI-Grafik genutzt wird kann ich derzeit nicht sagen, da ich WinAPI nur marginal behandle..



  • ok mit SwapBuffer(hdc); kann ich zwischen den beiden hin und her schalten...

    hmm.. kann ich einfach per BitBlt das ganze in den ´"unsichtbaren" Buffer schreiben und dann per SwapBuffer(hdc) sichtbar machen?

    Ist es möglich die Bilfer per BitBlt in dan BackBuffer zu schreiben und danach einfach den kompletten Buffer "irgendwie" in den Primary Buffer zu kopieren...

    kann nicht BitBlt auch kopieren? hat da jemand ahnung von wie?



  • 'nen Backbuffer kann man theoretisch überall verwenden, wo man schon 'nen Buffer hat.

    Bye, TGGC (Ein Jahr Helden)



  • und wie mach ich das?

    folgendes habe ich gerade probiert.. ging aber net

    //hdc is primar buffer
    //hdcMem und hdcMem2 -> "sekundär"
    do{
    SelectObjekt(hdcMem, variableBild1);
    BitBlt (hdcMem2, bx, by, bitmap.bmWidth, bitmap.bmHeight, 
                                        hdcMem, 1, 1, SRCCOPY) ;
    }while(....);
    BitBlt (hdc, bx, by, bitmap.bmWidth, bitmap.bmHeight, 
                                        hdcMem2, 1, 1, SRCCOPY) ;
    

    vorstellen tu ich mir.. alle bilder werden in den hdcmem selectiert und nach hdcMem2 kopiert.
    danach (schleife ist durch und beendet) wenn alle bilder geladen sind, soll hdcMem2 ins hdc kopiert werden und so dann gesamt angezeigt werden.. geht aber natürlich net 😞

    kann mir bitte jemand helfen?


  • Mod

    backbuffer ist jeder buffer den man gerade nicht sehen kann, hier ein ganz kompliziertes beispiel:

    unsigned int* pBackBuffer = new unsigned int[SCREENSIZEX*SCREENSIZEY];
    

    aber nicht weiter verraten, nachher wollen alle einen haben 🤡

    rapso->greets();



  • Es könnt auch'n Buffer sein, den man grad nicht hören kann. Oder den man nicht senden kann. Oder den man nicht...

    Bye, TGGC (Ein Jahr Helden)



  • man könnte auch einfach einen DC mit ner BITMAP drin anlegen die gleich groß is wie der wo man reinblitten will. dann erst alles dort reinblitten und dann das ganze "flippen"...



  • rapso schrieb:

    backbuffer ist jeder buffer den man gerade nicht sehen kann, hier ein ganz kompliziertes beispiel:

    unsigned int* pBackBuffer = new unsigned int[SCREENSIZEX*SCREENSIZEY];
    

    aber nicht weiter verraten, nachher wollen alle einen haben 🤡

    rapso->greets();

    Bist du immer so komisch oder tust du nur so. 😕 😃

    @Edwart

    Double-Buffering ist das was du suchen solltest.

    http://www.c-plusplus.net/forum/viewtopic.php?t=14713



  • ah, super vielen Dank.

    Nur noch eine kurze Frage. Das Beispiel bezieht sich ja auf ein Bitmap.
    Wie arbeite ich da eine Schleife ein um mehrere Bitmaps ins hDC2 zu bekommen?
    Das SelectObject überschreibt ja immer das aktuelle....
    Wo müsste da eine

    do{  }while(..);
    

    Schleife rein?

    HDC hDC = ...; // z.B. mit BeginPaint 
    HDC hDC2 = CreateCompatibleDC(hDC); 
    HBITMAP hBM = CreateCompatibleBitmap(hDC, cxClient, cyClient); 
    SelectObject(hDC2, hBM); 
    
    // Zeichenoperationen auf hDC2... 
    
    BitBlt(hDC, 0, 0, cxClient, cyClient, hDC2, 0, 0, SRCCOPY); 
    // Ein SelectObject(OldBitmap); ist imho nicht nötig 
    DeleteObject(hBM); 
    DeleteDC(hDC2);
    

    [edit="rapso"]kaputten tag gefixt[/edit]


  • Mod

    Netzwerk-Latenz schrieb:

    Bist du immer so komisch oder tust du nur so. 😕 😃

    wer in seinem nick das wort "Late" hat, sollte nicht über andere lästern 😉 🤡

    rapso->greets();



  • TGGC schrieb:

    Es könnt auch'n Buffer sein, den man grad nicht hören kann. Oder den man nicht senden kann. Oder den man nicht...

    Oder es ist GERADE der Puffer, den man SIEHT (wenn man den Monitor 180° dreht)! 💡
    Muahahaha... Brüller! 😃 👍



  • könntet Ihr mir bitte ncohmal helfen wo da die do{}while(); schleife rein müsste? und wie der code dann aussieht?

    Vielen Dank
    Edwart



  • hilfe 😕


  • Mod

    hmm... ob das in den "projekte" bereich soll? hmm.. wieso sollte jemand für dich programmieren und wieso machst du das nicht selbst?

    rapso->greets();



  • Möglicherweise hilft dir das:
    http://www.c-plusplus.net/forum/viewtopic.php?t=96065&postdays=0&postorder=asc&start=0

    // Backbuffer erzeugen:
    hdc_backbuffer=CreateCompatibleDC(NULL);
    bmp_backbuffer=CreateCompatibleBitmap(NULL,640,480); // 640x480 großer Backbuffer
    bmp_previous=SelectObject(hdc_backbuffer,bmp_backbuffer);
    
    // CreateCompatibleDC() erzeugt automatisch eine 1x1 Pixel große schwarz/weiss Bitmap
    // und selektiert sie in den erzeugten DC.
    // Wenn die Bitmap durch SelectObject() ersetzt wird sollte daher der Rückgabewert von SelectObject() gespeichert werden (das ja die 1x1 Bitmap wäre) und vor DeleteDC() wieder in den DC hinein-selektiert werden...
    
    // Einen 2. Memory-DC erzeugen:
    hdc_memdc=CreateCompatibleDC(NULL);
    
    // 100 Bilder in den Backbuffer packen:
    // Angenommen, die bilder wären schon geladen...
    for (i=1; i<=100; i++)
    {
        old_bmp=SelectObject(hdc_memdc,bild[i]);
        BitBlt(hdc_backbuffer,...hdc_memdc,...);
        SelectObject(hdc_memdc,old_bmp);
    }
    
    // Anschließend den Backbuffer sichtbar machen:
    // hdc ist der DC vom Fenster.
    BitBlt(hdc,...hdc_backbuffer,...);
    
    // Aufräumen:
    SelectObject(hdc_backbuffer,bmp_previous);
    DeleteObject(bmp_backbuffer);
    DeleteDC(hdc_backbuffer);
    DeleteDC(hdc_memdc);
    
    // Die geladenen Bilder freigeben ;D
    


  • irgendwie klappts bei mir net.. die bilder werden nicht angezeigt... .

    habs jetzt erstmal, um es generell zum laufen zu bringen nochmal ohne scleiufe programmiert und es geht net.. (ging mit schleife VORHER auch net, deshalb hatte ich gefragt wo die schleife hin muss)...

    Folgenden Code für nur 1 Bitmap habe ich jetzt erstmal aus deinem übernommen - geht leider nicht:

    HDC hdc, hdcMem, hdc_backbuffer; ist unter den Includes bereits vorhanden.

    case WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;
                hdcMem = CreateCompatibleDC (NULL) ;
    // Backbuffer erzeugen:
    hdc_backbuffer=CreateCompatibleDC(NULL);
    HBITMAP bmp_backbuffer;
    HGDIOBJ  bmp_previous;
    HGDIOBJ  old_bmp;
    bmp_backbuffer=CreateCompatibleBitmap(NULL,1024,768); // 640x480 großer Backbuffer
    bmp_previous=SelectObject(hdc_backbuffer,bmp_backbuffer); 
                old_bmp=SelectObject (hdcMem, backgr);
                BitBlt (hdc_backbuffer, 0, 0, 1024, 768, 
                                        hdcMem, 0, 0, SRCCOPY) ;
                                        SelectObject(hdcMem,old_bmp);
    
                    BitBlt (hdc, 0, 0, 1024, 768, 
                                        hdc_backbuffer, 0, 0, SRCCOPY) ; 
    
    SelectObject(hdc_backbuffer,bmp_previous);
    DeleteObject(bmp_backbuffer);
    DeleteDC(hdc_backbuffer);                               
             DeleteDC (hdcMem) ;
             EndPaint (hwnd, &ps) ; 
    
    return 0;
    

    fenster bleibt leer...

    schreibe ich im ersten BitBlt gleich in den "hdc" dann gehts

    irgendein problem mit dem backbuffer scheint es da wohl zu geben..

    kann mir, der auf der leitung steht und momentan net durchblick, bitte jemand noch mal helfen, auch wenn ich euch auf den keks gehen mag?



  • Vermutlich darf man bei CreateCompatibleBitmap() als ersten Parameter doch nicht einfach NULL setzen.
    Probier mal:

    HDC desktopDC;
    
    desktopDC=GetDC(HWND_DESKTOP);
    
    hdc_backbuffer=CreateCompatibleDC(desktopDC);
    HBITMAP bmp_backbuffer;
    HGDIOBJ  bmp_previous;
    HGDIOBJ  old_bmp;
    bmp_backbuffer=CreateCompatibleBitmap(desktopDC,1024,768); // 640x480 großer Backbuffer
    ...
    ReleaseDC(HWND_DESKTOP,desktopDC);
    

Anmelden zum Antworten