GDI-Objekte werden nicht freigegeben
-
Folgender Code:
CBitmap MyCBitmap; CBitmap TempBmp; CBrush Brush, *pBrushOld; // LoadImgFromFile benützt intern GDI+ um ein png-File von der // Platte zu lesen. // Mittels Gdiplus::Bitmap::GetHBITMAP hol ich ein HBITMAP TempBmp.Attach((HBITMAP)il.LoadImgFromFile(AfxGetInstanceHandle(), csPath, iltBitmap, true)); // Wird das gesuchte Bild auf der Platte nicht gefunden // wird ein Default aus der Resourcen geladen if((HBITMAP)TempBmp == NULL) MyCBitmap.LoadBitmap(IDB_PUTZ); // Brush erzeugen, if((HBITMAP)TempBmp != NULL) Brush.CreatePatternBrush(&TempBmp); else Brush.CreatePatternBrush(&MyCBitmap); pDC->SetBrushOrg((int)dX, rect.top); pBrushOld = pDC->SelectObject(&Brush); pDC->Rectangle((int)dX, rect.top, (int)(dX + dDicke + 1), rect.bottom); pDC->SelectObject(pBrushOld); // Macht ein DeleteObject auf das HBITMAP von GetHBITMAP (GDI+) il.Clear(); Brush.Detach(); Brush.DeleteObject(); MyCBitmap.DeleteObject(); TempBmp.DeleteObject();
Dieser Ausschnitt wird sehr oft hintereinander aufgerufen.
Nach jedem Durchlauf hab ich 3 GDI-Objekte mehr offen, als zu Beginn, obwohl ich meiner Meinung nach alles schließe/freigebe. Dies führt nach einer gewissen Zeit zu Problemen, da bei ~10000 GDI-Objekten Schluss ist.Sieht hier jemand, was ich vergessen habe oder falsch mache?
Danke.
-
Du hast ein Brush.Detach gemacht und kein DeleteObject!
Vergiss die Aufrufe von DeleteObject doch einfach, dass macht der Destruktor!
-
Danke, es waren aber eigentlich zwei Probleme.
Das mit dem Detach() und im darunterliegenden Code beim Laden des PNG. Jetzt passt es aber.Danke für die Hilfe.