objekt löschen

IT-Master

Grünschnabel

hallo zusammen hab folgendes problem !

ich kann die objekte pen und brush nicht löschen .
Wie kann ich die richtig löschen ?

warte auf antworten mfg

--------------------------------------------------------------------


void CTicTacToeView::OnDraw(CDC* pDC)
{
CTicTacToeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen




CRect r;
GetClientRect(&r);

int W =0;
int H =0;

W = r.right;
H = r.bottom;
pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
brush.CreateSolidBrush(RGB(255,255,0));

pDC->SaveDC();


pDoc->Ressize(0.1 *W,0.1 *H,0.9 *W,0.9 *H);//Grösse ändern




pDC->SelectObject(&brush);

pDoc->brush.DeleteContents(); // so klappt es nicht

pDC->SelectObject(&pen);

pDoc->DeleteContents(); // so auch nicht wie kann ich

// die objekte löschen die objekte sind
// pen und brush


pDC->Rectangle (pDoc->m_rechteck);


}
 
Das kann so nicht gehen, da brush und pen keine Members von CTicTacToeDoc sind.
Was willst Du denn mit dem 'löschen' erreichen? Ein DC muß immer einen aktiven Brush und Pen haben, da er sonst nicht zeichnen kann. Wenn Du die vorherigen Einstellungen für Brush und Pen im DC wiederherstellen willst, dann mußt Du Dir den jeweiligen Zeiger merken, der von SelectObject zurückgegeben wird. den Kannst Du dann ebenfalls wieder mit SelectObject auswählen:
Code:
CBrush *pPrevBrush;
    CPen *pPrevPen;
    
    //Neue Objekte erzeugen
 pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
 brush.CreateSolidBrush(RGB(255,255,0));
    pPrevBrush = pDC->SelectObject(&brush);
 pPrevPen = pDC->SelectObject(&pen); 
    //Zeichnen
    ...
    //Alte Objekte wiederherstellen
  pDC->SelectObject(pPrevBrush );
  pDC->SelectObject(pPrevPen );
 
jokey2 hat gesagt.:
Das kann so nicht gehen, da brush und pen keine Members von CTicTacToeDoc sind.
Was willst Du denn mit dem 'löschen' erreichen? Ein DC muß immer einen aktiven Brush und Pen haben, da er sonst nicht zeichnen kann. Wenn Du die vorherigen Einstellungen für Brush und Pen im DC wiederherstellen willst, dann mußt Du Dir den jeweiligen Zeiger merken, der von SelectObject zurückgegeben wird. den Kannst Du dann ebenfalls wieder mit SelectObject auswählen:
Code:
CBrush *pPrevBrush;
    CPen *pPrevPen;
    
    //Neue Objekte erzeugen
 pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
 brush.CreateSolidBrush(RGB(255,255,0));
    pPrevBrush = pDC->SelectObject(&brush);
 pPrevPen = pDC->SelectObject(&pen); 
    //Zeichnen
    ...
    //Alte Objekte wiederherstellen
  pDC->SelectObject(pPrevBrush );
  pDC->SelectObject(pPrevPen );


hallo erstmal,

das was du geschrieben hast stimmt .
Das mit alte zustände rückgängig machen haben ich in mein programm drin .
Trotzdem danke nochmal.

wenn ich die Zeilen

pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
brush.CreateSolidBrush(RGB(255,255,0));

in konstruktor festlege klappt alles wie ich es haben will aber ich will es in OnDraw festlegen, weil ich die farben ja z.b. zwischen durch mal ändern will deshalb.

wenn ich es nicht in konstruktor mache klappt auch alles aber er gibt mir dan eine fehl meldung aus ( speicher fehler.... ) , wenn ich das rechteck verkleinern will , wenn er angezeigt wird.

wenn ich nicht mit der grösse spiele ist alles ok .

ich muss die objekte löschen ! aber wie?

, weil sonst ruft er ja immer wieder neue objekte auf bei jeden aufruf von OnDraw....

warte auf antwort
mfg
 
Wenn Du die Objekte als Member Deiner Klasse anlegen willst, mußt Du sie im Konstruktor, wie Du es geschrieben hast auch mit 'CreatePen(..)' und 'CreateBrush(..)' erzeugen und im Destruktor mit 'pen.DeleteObject()' und 'brush.DeleteObject()' wieder löschen. Ich glaube, 'CGdiObject::)eleteObject()' ist das, was Du gesucht hast. 'CGdiObject' ist die Basisklasse von CPen und Co.
Du mußt auf jeden Fall darauf achten, daß die Objekte immer nur einmal erzeugt werden. Wenn Du z.B. 'CreatePen(...)' mehrfach hintereinander aufrufst, ohne den Pen zwischendurch immer wieder zu löschen, gibt es einen Fehler.
 
hallo


danke !

jetzt klapt es .
hab es mit
pen.DeleteObject();

gelöscht bekommen.

pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
brush.CreateSolidBrush(RGB(255,255,0));

sind jetzt nicht in der konstruktor sonder in OnDraw.

Als ich die in Konstruktor geschrieben hatte gibt er mir auch keine fehl meldung , weil der destruktor ja ehe automatisch die erzeugten objekte löscht .

danke noch mal

<< Die Ganze Lösung für die leute die es vieleicht mal brauchen werden ......>>


CRect r;
GetClientRect(&r);

int W =0;
int H =0;

W = r.right;
H = r.bottom;
pen.CreatePen(PS_SOLID,8,RGB(0,0,255));
brush.CreateSolidBrush(RGB(255,255,0));

pDC->SaveDC();


pDoc->Ressize(0.1 *W,0.1 *H,0.9 *W,0.9 *H);//Grösse ändern


pDC->SelectObject(&brush);

pDC->SelectObject(&pen);


pDC->Rectangle (pDoc->m_rechteck);

pen.DeleteObject();
brush.DeleteObject();
 
Du mußt auf jeden Fall darauf achten, daß die Objekte immer nur einmal erzeugt werden. Wenn Du z.B. 'CreatePen(...)' mehrfach hintereinander aufrufst, ohne den Pen zwischendurch immer wieder zu löschen, gibt es einen Fehler.
Bin mit nicht sicher ob es da einen Fehler gibt aber was es in jedem Fall gibt ist ein sog. GDI-Resource-Leak.

Daniel
 
was meinst du mit GDI-Resource-Leak
Das heißt, daß für das entsprechende Objekt Speicher reserviert wird, der dann nicht mehr freigegeben wird. Wenn Du also bei jedem Aufruf von OnPaint einen Pen erzeugen würdest, ohne ihn am Ende von OnPaint wieder zu löschen, dann wächst der Speicherbedarf Deines Programmes ziemlich schnell an, bis Dein Speicher voll ist, das System immer langsamer wird und irgendwann gar nichts mehr geht.
Das war das, was ich mit Fehler gemeint habe.
 
Zurück