GDI Handles und Freigabe



  • Hi!
    Ich hab ein Problem:
    folgender code funktioniert nicht, da das übergebene HDC zerstört wird. Wieso wird dadurch auch das hdc zerstört?

    HDC hdc;
            HBITMAP hbitmap;
    
            /*Funktionsbeginn*/
            HDC _hdc=CreateDC("DISPLAY", "DISPLAY", 0, 0);
            HDC _hpuffer= CreateCompatibleDC(_hdc);        
            hdc=_hpuffer;     
    
            HBITMAP _puffer=CreateCompatibleBitmap(_hdc, _width, _height);
            hbitmap=_puffer;
            SelectObject(hdc, hbitmap);
    
            DeleteObject(_hdc);            
            DeleteObject(_hpuffer); 
            DeleteObject(_puffer);  
    
            /*Funktionsende*/
    

    wenn ich aber das "DeleteObject(_hpuffer)" funktioniert alles (d.h. der HDC bekommt später ein Bild zugewiesen dass sich ohne probleme auf den screen bringen lässt) -> aber ich hab dann ein GDI-Leak.

    Wieso kriege ich schon durch einfache zuweisungen wie
    "HDC _hpuffer= CreateCompatibleDC(_hdc);" ein GDI-leak, wenn ich _hpuffer nicht zerstöre??? Bei GetDC(hwnd) passiert das auch.

    Was kann ich gegen diese behinderten Leaks machen, ohne dass mein HDC zerstört wird?

    grüße
    chris90



  • chris90 schrieb:

    Wieso kriege ich schon durch einfache zuweisungen wie
    "HDC _hpuffer= CreateCompatibleDC(_hdc);" ein GDI-leak

    Das ist zwar auch eine Zuweisung, aber zuallererst wird hier was "erzeugt" (create).

    chris90 schrieb:

    Was kann ich gegen diese behinderten Leaks machen, ohne dass mein HDC zerstört wird?

    Die Handles in der richtigen Reihenfolge lösachen 😉
    Warum verwendest Du nicht BitBlt um das Bitmap zu Zeichnen? Ich bin mir gerade unsicher ob es mit dem "SelectObject" ausreicht...



  • Um das Bitmap zu zeichnen verwende ich später auch BitBlt.
    Könntest du meinen Code nicht einfach grad so umschreiben, dass es keine probleme mehr gibt? Weil ich hab schon versucht die handle-freigabe umzukehren aber es klappt nicht.

    mfg
    chris90



  • Du musst das Bitmap natürlich erst Zeichnen, bevor Du was freigibst... das felt ja hier ganz in Deinem Code...



  • ja aber die eigentlichen handles werden ja gar nicht gelöscht... nur die die die funktionen übergeben bekommen haben.

    d.h. nach funktionsende sollten hdc und hbitmap beide noch funktionieren, oder??



  • Ich weiss ja nicht was die Zuweisungen zu "hdc" und "hbitmap" sind... aber diese werden auf jeden Fall gelöscht...



  • Was machst du denn mit hpuffer ?


Anmelden zum Antworten