kein DC mehr Frei
-
CRect CDetailWindow::SetWindowMappingRect(CRect rect)
{
CDC *pDC = GetWindowDC();
SetScreenMapping(*pDC);
pDC->LPtoDP(rect);
pDC->ReleaseOutputDC();
pDC->DeleteDC();
delete *pDC;
return rect;
}In folgender Funktion fordere ich eine DC an. Wenn das Programm länger läuft treten komische graphische - Effekte auf. Ich weiß, dass es nur eine begränzte Anzahl von DCs gibt - Gebe ich den DC eigentlich auch wieder richtig frei?
Folgende Fehlermeldung:
The instruction at "0x00439d8a" referencd memory at "0x00000000". The memory could not be "read"Danke.
mfG
Martin
-
Servus,
ich habe DeleteDC und ReleaseDC getauscht, dann geht es. Aber leider kann ich dir das nicht erklären, warum das so ist

CRect CDetailWindow::SetWindowMappingRect(CRect rect) { CDC *pDC = GetWindowDC(); SetScreenMapping(*pDC); pDC->LPtoDP(rect); pDC->DeleteDC(); // getauscht mit Release pDC->ReleaseOutputDC(); delete *pDC; return rect; }So geht es aber..... aber keine Erklärung -> keine Ahnung davon

*winke*
Hellsgore
-
Seid ihr euch überhaupt sicher, dass man DELETEDC in diesem Fall nutzen darf/ kann/ sollte?
Denn meines Erachtens würdet ihr damit den Original-DC des "angezapften" Fensters löschen...
-
a schrieb:
Seid ihr euch überhaupt sicher, dass man DELETEDC in diesem Fall nutzen darf/ kann/ sollte?
Denn meines Erachtens würdet ihr damit den Original-DC des "angezapften" Fensters löschen...
Aloha,
absolut korrekt.
Ums Delete kümmert sich das Fenster selbst, wenn Du es schließt.
CDC *pDC = GetWindowDC(); SetScreenMapping(*pDC); pDC->LPtoDP(rect); ReleaseDC(pDC); return rect;ist alles was Du brauchst...
Die Anzahl Deiner GDI-Objekte kannste übrigens sehr geil mit dem Task Manager betrachten.
In Deinem Falle müßten die so sehr gewachsen sein, daß der Speicher Deiner Graka irgendwann "Game over" sagte...Grüße
BOA
-
funktioniert.
Danke