DeleteObject
-
Hallo,
ich habe einen HandleDeviceContext mit dem ich zeichnen möchte.
Dieser hat allerdings nicht die richtige Farbe.
Damit:HPEN myPen= CreatePen(0,1,RGB(1000,0,0)); SelectObject(hDC,myPen);kann ich die Farbe ändern. Muss ich das Objekt dann mit
DeleteObject(myPen);
irgendwann löschen?Grüße
Huddi
-
Ja, das mit CreatePen() erzeugte Objekt mußt Du wieder mit DeleteObject() löschen (wenn Du es nicht mehr benötigst).
Als Faustregel kann man ungefähr sagen:
Alles was mit CreateXXX() erzeugt wurde, muß später mit DeleteObject() wieder gelöscht werden.Aber ich würde immer die jeweilige Hilfe (mit F1) oder im MSDN nachlesen.
Dort steht es geschrieben was zu tun ist, wie hier am Beispiel von CreatePen():
http://msdn.microsoft.com/en-us/library/dd183509(VS.85).aspxHTH, Martin
-
Aber Achtung. Wenn das Objekt durch SelectObject in den DC selektiert wurde, muss es auch wieder aus dem DC entfernt werden. Sonst kann man mit DeleteObjekt eben das Objekt nicht löschen.
Es bleiben GDI Leaks.
-
Danke für die Antworten!
Das ganze ist irgendwie doch komplizierter. Der DC wird später
(nach meinem code) noch benötigt, sowie er auch nicht von mir erstellt ist.Kann ich den DC irgendwie wieder in den ausgangszustand versetzen?
Oder gibt es die Möglichkeit einen eigenen Kontext aus dem alten Handle
zu erstellen und diesen Kontext dann komplett wieder zu löschen?Was kann eigentlich passieren wenn man das Objekt nicht löscht?
-
Benutz einfach den Rückgabewert von SelectObject:
// Stift erzeugen: HPEN myPen= CreatePen(PS_SOLID,1,RGB(255,0,0)); // Stift soll bei hDC verwendet werden: HGDIOBJ previousPen=SelectObject(hDC,myPen); // Irgendwas tolles zeichnen: // [..] // Stift wird nicht mehr gebraucht, vorher benutzten Stift rein-selektieren und selbst erzeugten Stift löschen: DeleteObject(SelectObject(hDC,previousPen)); // Jetzt ist der DC wieder wie ganz am Anfang...SelectObject() liefert immer das Objekt (vom gleichen Typ) zurück was vorher selektiert war.
Sprich: Wenn du nen eigenen Pen in ein DC selektierst, liefert SelectObject() den Pen der davor verwendet wurde.Objekte die du nicht selbst löscht werden erst beim Beenden der Anwendung von Windows gelöscht.
Im Taskmanager kannst du die Spalte "GDI-Objekte" einblenden, sollte der Wert dort nicht nur ein wenig schwanken sondern immer weiter wachsen, hast du irgendwo nen GDI-Leak in der Anwendung.
Ich weiss nicht genau wo da die Grenze liegt, aber ab ner gewissen Anzahl GDI-Objekte hagelt es (Grafik-)Fehler in deiner Anwendung. Früher zu Windows9x-Zeiten konnte man durch GDI-Leaks sogar Bluescreens oder andere lustige Probleme erzeugen...Achtung:
Objekte und DCs die du nicht selbst erzeugt hast NICHT löschen.
Ein DC der z.B. via GetDC() geholt wurde, sollte mit ReleaseDC() wieder freigegeben werden und NICHT mit DeleteDC() gelöscht werden.
Ein DC der z.B. mit CreateCompatibleDC() erzeugt wird, sollte auch hinterher mit DeleteDC() getötet werden.
Generell hat man eigentlich immer CreateXXX() -> DeleteXXX(), GetXXX() -> ReleaseXXX()
-
Man kann auch seinen Desktophintergrund auf ein schönes Blau stellen wenn man
die 10000 Objekte voll hat :D.Dankeschön! Hat mir sehr geholfen- jetzt funktionierts
-
Echt 10000 ? Habe ich noch nie ausprobiert
