Problem DD7 + GDI
-
Hallo,
ich überarbeite zur Zeit ein kleines Spiel mit VC++ 6 unter Verwendung von DirectX7 (DirectDraw ohne Direct3D).
OS: WinXP (SP2)Diesen Code verwende ich, um auf ein Surface (den Backbuffer) Linien zu zeichnen:
if (lpddsBack->GetDC(&hdc) == DD_OK) { HPEN hPen; hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0)); // = rot SelectObject(hdc, hPen); MoveToEx(hdc, drawX, drawY, NULL) LineTo(hdc, drawX2, drawY2); lpddsBack->ReleaseDC(hdc); }Problem: Die ersten Male klappt es wunderbar, aber nach einigen Linien wird die Linienfarbe automatisch auf schwarz , die Linienstärke auf 1 umgestellt, ohne dass ich das beeinflussen könnte. Beim Zeichnen von anderen Objekten ist es dass gleiche, nur die Randfarbe wird umgestellt.
Ich hoffe, jemand kann etwas mit diesem recht obskuren Fehler anfangen.Gruß,
Skuller
-
Hast du schon mal probiert das
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0)); // = rotvorher einmalig zu initialisieren und anschließend nur noch auf hpen zuzugreifen..?
-
Du erzeugst ja sonst bei jeder Linie ein neues Pen-Objekt!
D.h. du hast ein riesiges Speicherleck.
-
TomasRiker schrieb:
Du erzeugst ja sonst bei jeder Linie ein neues Pen-Objekt!
D.h. du hast ein riesiges Speicherleck.Japp, das ist _immer_ das Problem, wenn GDI nach 'ner Weile abspackt: unsauberer Code. f'`8k
Gruß, TGGC (\-/ returns)
-
Merkwürdig, ich habe das jetzt so abgeändert, dass das Pen-Objekt nur einmal initialisiert und gewählt wird, jetzt funktioniert das Linienzeichnen auch deutlich länger, aber nach einer gewissen Zeit bzw. Anzahl Linien werden überhaupt keine Linien und andere Objekte mehr gezeichnet.
Text mit textout() zu schreiben funktioniert dagegen ohne Probleme.
-
Setze mal vor dem ReleaseDC wieder den "alten" Stift ein, vielleicht bringt das was.
// alten Stift sichern HPEN oldPen = (HPEN)SelectObject(dc, newPen); // zeichnen // ... // alten Stift wieder einsetzen SelectObject(dc, oldPen); p_surface->ReleaseDC(dc);