WIN32: Probleme mit Programmablauf

Mr Apfelkuchen

Erfahrenes Mitglied
Hi ,
ich hab mal eine Frage:) Unzwar ist es so das ich ein, naja Tetrisähnliches Spiel in der WIN32-API geschrieben habe.
Um das absacken der Blöcke zu realisieren habe ich nach jedem Vorschub der Blöcke richtung Boden ein
Code:
rect.top= x; rect.bottom= x; rect.left= x; rect.right= x;
InvalidateRect(hwnd,&rect,TRUE);
Dabei ist x natürlich immer ein zuberechnender Wert;) . Nun passiert es aber, dass das Programm nach ca. 5 Minuten einen kompletten Absturz erleidet. Das heisst es wird der ganze Bildschirm schwarz und es wird auch in andere Fenster hineingezeichnet etc., solange bis man das Programm mit dem Task-Manager beendet. Meine Frage ist nun ob das mit der Art meiner Bildschirmaktualisierung zu tuen hat, oder aber evtl. auch mit dem Nicht-Löschen von Paintstructuren oder Brush, bzw. Painthandles. Mir fällt sonst nämlich nichts ein, was das Programm von einem Moment zum nächsten so zerlegen kann...
Hoffe die Schilderung des Problems war verständlich;)
Danke schonmal im vorraus,
Mr Apfelkuchen
 
Das klingt klar nach einem Resourcen-Leck. D.h. irgendwo werden irgendwelche GDI Handles (Brushes, HDCs, etc.) nicht sauber freigegeben.
 
Also ich lese ne ganze menge kleiner bilder am anfang ein. Die lösche ich erst bei programmende, ansonsten benutze ich hPen und hBrush folgendermasen:
BSP:
Code:
hPen = CreatePen(PS_SOLID,1,RGB(255,255,255));
SelectObject(hdc,hPen);
//...
DeleteObject(hPen);

Und dann is das doch sauber rausgelöscht oder:P?
 
Nein, nicht ganz. Da ist dann immer noch der HPEN im HDC drin.

SelectObject gibt immer das alte selektierte Objekt zurück. Das sollte man dann am Ende wieder reinsetzen. Zu beachten, ein HDC ist quasi ein Zugriffsobjekt auf ein grafisch beschreibbares Objekt. Ein HDC hat von jedem GDI-Handle-Typ eine Instanz gespeichert.

Code:
HPEN hPen = CreatePen( PS_SOLID, 1, RGB( 255, 255, 255 ) );
HPEN hOldPen = (HPEN)SelectObject( hdc, hPen );
// zeichnen
SelectObject( hdc, hOldPen );
DeleteObject( hPen );

Dasselbe auch für HBRUSH usw.
Evtl. nochmal nachprüfen, wie du den HDC bekommst, und wie du den freigibst. Benutzt du den HDC, den du von BeginPaint bekommst? (Solltest du)
GetDC gehört mit ReleaseDC gepaart, CreateDC mit DeleteDC. Nicht mischen!
 
Zurück