BackBuffer für Grafik ohne DirectX



  • 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