SelectObject() DeleteObject()

Thomasio

Erfahrenes Mitglied
Wenn ich einen HDC erstelle und da rein eine HBITMAP wähle, ohne dabei ein Fenster zu erstellen, etwa so:

Code:
HDC ScreenDC = GetDC(0);
HDC hdc = CreateCompatibleDC(ScreenDC);
HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"MyImage.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hdc,MyBitmap);

wie lösche ich den Kram dann wieder?

Ich weiss nur 2 Dinge:
1) DeleteObject() funktioniert nicht, solange das Objekt in einem HDC ausgewählt ist.
2) Wenn ich im case WM_PAINT eines Fensters sowas mache:

Code:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP MyBitmap = CreateCompatibleBitmap(hdc,100,20);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,MyBitmap);

...

SelectObject(hdcMem,hbmOld);
DeleteDC(hdcMem);
DeleteObject(MyBitmap);
EndPaint(hWnd,&ps);

dann kann DeleteDC() offensichtlich die ausgewählte HBITMAP mit löschen, aber MyBitmap muss ich immer noch separat löschen.

In kurz: Wie räume ich das auf, ohne Fenster, ohne WM_PAINT, und ohne Leaks?
 
Hallo,

In der MSDN ist für SelectObject folgendes zu finden:

This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.

Wenn du nach Ablauf deines Programmes wieder das originale Objekt reinlädst solltest du deines löschen können.
 
...dann kann DeleteDC() offensichtlich die ausgewählte HBITMAP mit löschen, aber MyBitmap muss ich immer noch separat löschen.
Nicht ganz. Mit DeleteDC() wird das Objekt gelöscht, dessen Handle zum Kontext gespeichert wurde. Mit SelectObject() überschreibst du das Default-Handle zum Default-Objekt mit dem deines eigenen Objektes. Das Default-Handle bekommst du ja als Rückgabewert der Funktion. Wenn du nun DeleteDC() aufrufst, ohne das Default-Handle wieder einzutragen (mit SelectObject) , wird zwar dein eigenes Objekt gelöscht, aber nicht das Default-Objekt. Damit hast du ein Speicherloch.

Ansonsten gilt: Alle GDI-Objekte, die mit Create,,,() erzeugt werden müssen mit der korresepondierenden Delete...()-Funktion wieder gelöscht werden.

In deinen Code habe ich übrigens keinen Fehler erkennen können - das Aufräumen machst du richtig.

Gruß
MCoder
 
Erstmal danke für die Antworten, das leuchtet mir soweit alles ein, nur eine Frage bleibt da offen.

Wo ist mein Default Handle in

Code:
HDC ScreenDC = GetDC(0);
HDC hdc = CreateCompatibleDC(ScreenDC);
HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"MyImage.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hdc,MyBitmap);

bzw. wie schaut die Syntax aus mit der ich das wieder auswähle und lösche?


Edit: Ich nehme die Frage zurück, hab mich nur mal wieder zu blöd angestellt, das geht natürlich genauso wie im WM_PAINT.

Vielen Dank für eure Hilfe.
 
Zuletzt bearbeitet:
Zurück