Hallo zusammen,
ich versuche grade mit einem normalen C Compiler Dev-Cpp unter WinXP ein
Programm zu erstellen, das mir eine grafische Ausgabe ermöglicht.
In dem Programm wird nur ein Kasten gezeichnet. In diesen Kasten soll
eine Sinusfunktion dargestellt werden. Das funktioniert soweit auch.
Allerdings werden die Linien nach einer bestimmten Anzahl an Ausgaben
alle dünn und schwarz, wie in dem Bild im Anhang zu sehen. So wie es bis
jetzt aussieht kann ich ca 1000 Linien zeichnen bis dieses Problem
auftritt. Wenn man die TIMESTEP Konstante auf z.B. 0.01 reduziert
verringern sich natürlich die Anzahl der ausgegebenen Objekte, dann ist
alles in Ordnung. Ich musste ein Foto machen, da Windows wenn das
Programm läuft meint es wäre nicht mehr genügend Arbeitsspeicher zum
Screenshot machen da.
mfg
Stefan
Vor allem würde ich PAINTSTRUCT erstmal nicht in WinMain deklarieren,
sondern innerhalb der CALLBACK Funktion und dann BeginPaint() /
Endpaint() als Ereignis einer WM_PAINT Nachricht verarbeiten.
Hallo,
ich habe mal probiert alles in den Teil zu kopieren das es bei der
WM_PAINT Nachricht ausgeführt wird. Das bringt keinen Unterschied, wie
ich allerdings auch erwartet habe.
mfg
Stefan
Erzeuge nicht für jeden lineto-Aufruf einen neuen Pen (mit CreatePen),
sondern mach das genau einmal.
Sofern zwischenzeitlich im DC auch nichts anderes ausgegeben wird, ist
es auch nicht erforderlich, den Pen wieder und wieder in den DC zu
selektieren.
Aus den Anfangstagen der Windows Programmierung gibt
es 2 Grundregeln
* Objekte die man erzeugt, muessen auch wieder zerstört werden.
Ich sehe zwar den Aufruf für CreatePen, aber kein dazu
korrespondierendes DeleteObject
* Objekte die in einen DC selektiert werden, müssen aus dem DC
wieder deselektiert werden, bevor ein DC zerstört werden kann.
Dazu merkt man sich den Rückgabewert von SelectObject und setzt
diesen wieder, bevor der DC zerstört wird.
Insbesondere letztere Regel war in Win 3.1 besonders wichtig, da
Windows nur über eine begrenzte, kleine Anzahl von DCs verfügte.
Hatte man im DC den Urzustand nicht wieder hergestellt, dann wurde
der DC auch nicht zerstört und man rannte sehr schnell 'out of DC'.
Diese Begrenzung gibt es auch in WinXP, allerdings fängt dann das
Programm das herumspacken an ("Kann Fenster nicht öffnen", "Ungültiges
Window-Handle" und derlei mehr), Fehlermeldungen oder ähnliches vom
Betriebssystem gibt es nicht.
Hallo,
danke, so funktioniert es.
Wenn ich weis das ich in meinem gesamten Programm nur 3 Pens verwende,
könnte ich diese am Programmanfang anlegen und am Ende wieder löschen?
Also im Prinzip so:
Stefan wrote:
> Hallo,> danke, so funktioniert es.>> Wenn ich weis das ich in meinem gesamten Programm nur 3 Pens verwende,> könnte ich diese am Programmanfang anlegen und am Ende wieder löschen?
Sicher kannst du.
>> Also im Prinzip so:> [c]> //Folgende Pens Global> HPEN pen_rot,pen_gruen,pen_blau,penalt;> //Da wo was gezeichnet werden soll den entsprechenden Pen anwählen> switch(color)> {> case 1:> SelectObject(hDC, pen_rot);> break;> case 2:> SelectObject(hDC, pen_gruen);> break;> case 3:> SelectObject(hDC, pen_blau);> break;> }
Wenn sicher gestellt ist, dass Color immer einen gültigen
Wert von 1 bis 3 hat, dann kannst du das auch so machen
HPEN pens[3];
pens[0] = CreatePen( ... );
pens[1] = ...
pens[2] = ...
....
SelectObject(hDC, pens[ color - 1]);
Wie auch immer du das machen willst.
>>>> //Beim Fenster schließen alle Pens löschen> SelectObject(hDC, penalt); //Sicherstellen das die zu löschenden Pens> nicht angewählt sind
Du wirst sehen, dass diese ständige 'alte xxx' merken und wieder
restaurieren auf Dauer lästig wird. Denn xxx kann ja alles mögliche
sein: Eine Bitmap, ein Brush, ein Pen, ein Font, ....
Daher möchte ich dir die Funktionen
SaveDC und RestoreDC ans Herz legen. Die vereinfachen das
Ganze etwas. Am Anfang deiner Funktion rufst du SaveCD auf
und am Ende (vor einem ev. Löschen von Resourcen) kommt
der RestoreDC und du kannst sicher sein, dass du nichts
vergessen hast zu restaurieren.