PointList langsam zeichnen

OliWan

Mitglied
Hi Coders!

Ich suche eure Hilfe!

Ich habe ein Array von Points. Dieses möchte ich gern in irgendeinem
dafür geeignetem Element innerhalb eines WinForms zeichen - und zwar
nicht alle auf einmal, sondern step by step, bzw. Eintrag für Eintrag.

Im Moment bin ich soweit:

Ich habe eine XML Datei mit Strichdetails. Jeder Sample eines Striches
hat eine X-Koordinate, eine Y-Koordinate und einen Unix Timestamp der
Entstehung. z.B.
x y Time
<Stroke>
806 6228 1149760002237
806 6227 40
807 6227 66
808 6227 80
808 6227 93
808 6227 106
809 6227 120
809 6227 133
809 6227 146
809 6226 160
808 6225 200
807 6224 226
807 6224 240
805 6222 253
801 6216 266
</Stroke>

Nun will ich diesen Strich so "nachmalen" dass er auch in Relation zu seinen Zeitabständen entsteht (Die letzte Zahl in jeder Reihe sind die Millisekunden Abstand zum vorangegangenem Sample - also die eigentliche Wartezeit)


Ich lese die Strokes ein und fülle Sie in eine ArrayList. Immer wenn ein neuer Strich anfängt, füge ich einen Platzhalter (-100) ein. Wenn alle Strokewerte im Array sind,
repainte ich eine PictureBox.

Hier die Paintmethode mit Kommentaren
Code:
	private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

			if (oli.Equals("yes")){ // oli ist nur auf yes, wenn der "malen" Button angeklickt wird 
//			MessageBox.Show("Start");
			SolidBrush brush = new SolidBrush(Color.Blue);
			System.Drawing.Pen pen0 = new System.Drawing.Pen(brush);
			pen0.Width=1;
			pen0.Alignment = PenAlignment.Center;

			ArrayList xyz = new ArrayList();
			int loop=0;
			foreach (PointF tp in list){// list ist die ArrayList mit den einzelnen Werten
			if (loop>0){
			if (tp.X>0){
			xyz.Add(tp);
			}else{
			PointF[] ptlast = (PointF[])xyz.ToArray(typeof(PointF));

			if (ptlast.Length>1){
				e.Graphics.DrawLines(pen0,ptlast);
			}else{
			 e.Graphics.FillRectangle(brush,ptlast[0].X,ptlast[0].Y,1,1);
			}


			xyz.Clear();

			}

			}
			loop++;
			}





		}// if oli.equals=yes
		}//void

Leider hakelt das total bei mir und es entsteht nicht wirklich jedes Sample einzeln. Irgendwie springt das Update immer um x-Samples und ich kriege komplette Zeichen und nicht eine entstehende Zeichnung der Zeichen?

Hat jemand von euch ne Idee? Evtl. ist PictureBox nicht geeignet.

Hope for help
OliWan

May the source be with your
 

Norbert Eder

Erfahrenes Mitglied
Du zeichnest auch alles auf einmal und wartest die Zeitpunkte nicht ab. Das was dir fehlt ist ein Thread.Sleep(Millisekunden).
 

OliWan

Mitglied
Hi Norbert!

Vielen Dank für die schnelle Antwort und sorry, aber da hab ich wohl nicht
gut genug gepostet.

Beim füllen meines Array, rufe ich ständig die pictureBox1.Refresh() auf. Diese wiederum
malt ständig den kompletten Inhalt des Array, den ich im loop immer um eine Koordinate erweitere (denn sonst sehe ich immer nur Pixelweise und die "alten" Zeichen verschwinden)

Bevor ich refresche, habe ich ein

Thread.Sleep(Convert.ToInt32(sampleparts[2])/10);



...;-) OliWan