Zerstören von zeichenobjekten wie CPen

gabifi

Mitglied
Was ich mich grad so gefragt habe: Muss ich eigentlich beim Zeichnen in der OnPaint alle Objekte, die ich so erzeuge, auch wieder selber löschen, oder passiert das automatisch.
So als Beispiel:
Code:
void CDialog::OnPaint()
{
         CPaintDC dc(this); // device context for painting

         CPen myPen( PS_SOLID | 1, RGB(0,0,0) );
         CPen pOldPen = dc.SelectObject(&myPen);

         // zeichnen....

         dc.SelectObject(pOldPen);
         myPen.DeleteObject();
}

Is also myPen.DeleteObject(); wirklich nötig, oder brauche ich das nur wenn ich den Pen über CreatePen(...) erzeuge?

Gibt ja keine Fehler, aber man will ja auch einigermaßen schön programmieren.
Gabriel
 
Ein explizites "DeleteObject" ist bei MFC-GDI-Objekten generell nicht nötig, da bei Zerstören des Objekts auch ein "DeleteObject" vom Destruktor ausgeführt wird. Wichtig sind nur die "SelectObject" - Paare.

Auf welche Art und Weise du das Objekt erzeugst, spielt übrigens keine Rolle. Bei der von dir verwendeten Variante, also die Pen-Eigenschaften dem Kontruktor übergeben, wird vom Kontruktor auch eine dem "CreatePen" entsprechende Funktionalität ausgeführt.
 
Ok. Also es reicht, wenn ich beim ersten SelectObject() eines Typs den Zeiger auffange und am Ende zurückgebe, egal wie oft ich darin z.B. den Pen wechsle?
 
Das ist richtig. Du brauchst dir nur ein einziges Mal am Anfang das "alte" GDI-Objekt merken. Du kannst zwischendrin auch andere verwenden (Brush, Bitmap etc.).

DeleteObject() wird gebraucht, falls du ein schon vorhandenes GDI-Objekt recyceln willst:
Code:
CPen pen(PS_SOLID , 1, RGB(0,0,0)); 
CPen *pOldPen = dc.SelectObject(&pen);

    :
    :

pen.DeleteObject();  // Achtung der Pen darf nicht mehr
                     // via SelectObject() verwendet werden,
                     // also ggf. dc.SelectObject(&pOldPen);
                     // vorher ausführen 

pen.CreatePen(PS_SOLID, 2, RGB(255,0,0)); // Pen mit anderen Eigenschaften 

    :
    :

Aber es ist natürlich übersichtlicher mit mehreren Objekten zu arbeiten.
 
Zurück