Backbuffer schmirt ab!



  • Ich habe einen kleinen Backbuffer (ein DC) auf dem ich dieganze zeit alles drauf zeichne. Wenn alles drauf gezeichnet ist, übertrage ich den Backbuffer auf mein FensterDC! Das problem ist nun, das nach einer weile nicht mehr gezeichnet wird, obwohl ich alle Ojecte etc. lösche!

    HPEN hPen1;
    			HPEN hPen2;
    			HBRUSH hBrush1;
    			SDSPAINT.hBackbufferDC = CreateCompatibleDC(NULL);
    			SDSWINDOWSTRICK[iInternWindow].strWindow.hDC = BeginPaint(SDSWINDOWSTRICK[iInternWindow].strWindow.hWindow, &SDSPAINT.psPaintstruct);
    			SDSPAINT.hbBBNew = CreateCompatibleBitmap(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC,SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight);
    			SelectObject(SDSPAINT.hBackbufferDC, SDSPAINT.hbBBNew);
    
    			SelectObject(SDSPAINT.hBackbufferDC, hPen1 = CreatePen(PS_SOLID, 1, RGB(0,0,0)));
    			SelectObject(SDSPAINT.hBackbufferDC, hBrush1 = CreateSolidBrush(RGB(63,63,63)));
    			Rectangle(SDSPAINT.hBackbufferDC, 0, 0, SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight);
    			SelectObject(SDSPAINT.hBackbufferDC, hPen2 = CreatePen(PS_SOLID, 1, RGB(192,192,192)));
    			Rectangle(SDSPAINT.hBackbufferDC, 1, 1, SDSWINDOWSTRICK[iInternWindow].iWidth-1, SDSWINDOWSTRICK[iInternWindow].iHeight-1);
    
    			BitBlt(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC, 0, 0, SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight, SDSPAINT.hBackbufferDC, 0, 0, SRCCOPY);
    			DeleteObject(hPen1);
    			DeleteObject(hPen2);
    			DeleteObject(hBrush1);
    			SDSWINDOWSTRICK[iInternWindow].strWindow.hDC = NULL;
    			SDSPAINT.hBackbufferDC = NULL;
    			DeleteDC(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC);
    			DeleteDC(SDSPAINT.hBackbufferDC);
    			DeleteObject(SDSPAINT.hbBBNew); 
    			EndPaint(SDSWINDOWSTRICK[iInternWindow].strWindow.hWindow, &SDSPAINT.psPaintstruct);
    

    Nunja, ich weiß nicht mehr weiter 😞



  • GDI-Objekte können nur gelöscht werden, wenn sie sich nicht mehr innerhalb eines DCs befinden. Deshalb müssen die vorherigen Objekte abschließend wieder in den DC zurückgewählt werden.

    HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
    HBRUSH hOldBrush = static_cast<HBRUSH>(SelectObject(SDSPAINT.hBackbufferDC, hBrush1));
    
    ...
    
    SelectObject(SDSPAINT.hBackbufferDC, hOldBrush);
    DeleteObject(hBrush);
    


  • Danke, da hat mir chonmal ehr geholfen, ich hab das nun bei allen Objekten gemacht, nur chmirt e immernoch ab, es dauert nur halt länger bis es soweit ist 😕

    SDSPAINT.hBackbufferDC = CreateCompatibleDC(NULL);
    			SDSWINDOWSTRICK[iInternWindow].strWindow.hDC = BeginPaint(SDSWINDOWSTRICK[iInternWindow].strWindow.hWindow, &SDSPAINT.psPaintstruct);
    			SDSPAINT.hbBBNew = CreateCompatibleBitmap(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC,SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight);
    			SDSPAINT.hbBBOld = static_cast<HBITMAP>(SelectObject(SDSPAINT.hBackbufferDC, SDSPAINT.hbBBNew));
    
    			HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(0,0,0));
    			HPEN hOldPen1 = static_cast<HPEN>(SelectObject(SDSPAINT.hBackbufferDC, hPen1));
    			HBRUSH hBrush1 = CreateSolidBrush(RGB(63,63,63));
    			HBRUSH hOldBrush1 = static_cast<HBRUSH>(SelectObject(SDSPAINT.hBackbufferDC, hBrush1));
    			Rectangle(SDSPAINT.hBackbufferDC, 0, 0, SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight);
    			HPEN hPen2 = CreatePen(PS_SOLID, 1, RGB(192,192,192));
    			HPEN hOldPen2 = static_cast<HPEN>(SelectObject(SDSPAINT.hBackbufferDC, hPen2));
    			Rectangle(SDSPAINT.hBackbufferDC, 1, 1, SDSWINDOWSTRICK[iInternWindow].iWidth-1, SDSWINDOWSTRICK[iInternWindow].iHeight-1);
    
    			BitBlt(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC, 0, 0, SDSWINDOWSTRICK[iInternWindow].iWidth, SDSWINDOWSTRICK[iInternWindow].iHeight, SDSPAINT.hBackbufferDC, 0, 0, SRCCOPY);
    
    			SelectObject(SDSPAINT.hBackbufferDC, hOldBrush1);
    			DeleteObject(hBrush1);
    			SelectObject(SDSPAINT.hBackbufferDC, hOldPen1);
    			DeleteObject(hPen1);
    			SelectObject(SDSPAINT.hBackbufferDC, hOldPen2);
    			DeleteObject(hPen2);
    			SelectObject(SDSPAINT.hBackbufferDC, SDSPAINT.hbBBOld); 
    			DeleteObject(SDSPAINT.hbBBNew);
    
    			SDSWINDOWSTRICK[iInternWindow].strWindow.hDC = NULL;
    			SDSPAINT.hBackbufferDC = NULL;
    			DeleteDC(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC);
    			DeleteDC(SDSPAINT.hBackbufferDC); 
    			EndPaint(SDSWINDOWSTRICK[iInternWindow].strWindow.hWindow, &SDSPAINT.psPaintstruct);
    


  • // DeleteDC(SDSWINDOWSTRICK[iInternWindow].strWindow.hDC);
    DeleteDC(SDSPAINT.hBackbufferDC); 
    EndPaint(SDSWINDOWSTRICK[iInternWindow].strWindow.hWindow, &SDSPAINT.psPaintstruct);
    
    SDSWINDOWSTRICK[iInternWindow].strWindow.hDC = NULL;
    SDSPAINT.hBackbufferDC = NULL;
    

    SDSWINDOWSTRICK[iInternWindow].strWindow.hDC braucht nicht gelöscht zu werden. SDSPAINT.hBackbufferDC erst löschen und dann nullen.



  • Ja, habe ich auch gerade heraus bekommen 🙂

    Das peoblem ist, das ich funktionen habe die alle etwas in de backbuffer zeichnen. Also kann ich den Backbuffer erst im nachhinein löschen, da erst am ende einer ganz anderen funktion der backbuffer auf das fensterDC übertragen wird 😕

    EDIT::::

    Dies hat ungefair diese struktur:

    void a()
    {
        //zeichne viereck
    }
    
    void b()
    {
        //zeichne dreieck
    }
    
    void c()
    {
        // zeichne kreis
    }
    
    void d()
    {
        // übertrage backbuffer auf fensterDC
    }
    

    Ic müsste in den einzelnen fnktionen die objekte löschen können!



  • Dann musst Du den DC eben erst am Ende löschen. Der von Dir gepostete Code

    SDSPAINT.hBackbufferDC = NULL; 
    DeleteDC(SDSPAINT.hBackbufferDC);
    

    verursacht aber definitiv einen GDI-Leak, weil der DC schon vor dem Löschen genullt wird.



  • Ich dachte der müsste immer vor dem löschen der objekte gelöscht werden?



  • Nein. Es können nur keine Objekte gelöscht werden, wenn sie sich noch in einem DC befinden.


Anmelden zum Antworten