OnPaint
-
Hallo,
ich habe folgendes Problem, ich muss auf einem UserControl ca. 20 000 Rechtecke (DrawRectangle FillRectangle) zeichnen. Jedes Rechteck ist in einer Liste als Objekt gespeichert. Als Objekt, weil jedes Rechteck einen Zustand besitzt. Das ganze sieht aus wie ein feines Gitter.
Das erste Problem ist, dass das zeichnen zu lange dauert. Ich habe das gleiche (Prototyp) gesehen, was mit VB6 geschrieben worden ist, und das Zeichnen dauert viel schneller. Ich benutze DoubleBuffer, was aber nicht recht viel geholfen hat. Diese Routine sieht ca. so aus:irgendeinObjekt o; for (int i = 0; i < Liste.Count; i++) { o = Liste[i]; if (o.isChecked) { g.DrawRectangle(p, o.x, o.y, o.Width, o.Height); g.FillRectangle(b, o.x, o.y, o.width, o.height); } else { g.DrawRectangle(s, o.x, o.y, o.Width, o.Height); g.FillRectangle(bs, o.x, o.y, o.width, o.height); } }
ich habe schon foreach schleife benutzt, aber ich glaube sie ist etwas langsamer.
Dann beim minimieren von Frame wird es neu gezeichnet, ich habe die Methode OnPaint überladen, wenigstens habe ich gelesen, dass man so etwas machen soll. Ich weiß nicht aber was soll ich mit der Überladung und wie genau es funk. Das gleiche kann ich doch unter UserControl_Paint() schreiben, oder??
Kann mir jemand sagen, wie ich diese neu zeichnen unterdrücken kann? Ich habe schon mit Invalidate(Region) versucht, aber es haut nicht hin.Zweitens ich muss per Maus Klick (linkes Mausknopf haltend) und maus Bewegung einige Rechtecke selektieren können. Aber, wenn ich das mache wird bei jeder Bewegung mit der Maus das Bild neu gezeichnet. Kann ich so etwas wie Overlayer erzeugen, d.h. auf dem ersten Layer (Zeichnung) zweite drauf zu setzen ohne das untere zu beeinflussen??
Vielen Dank im Voraus
Ps. Ich benutze .Net 2005 (C#)
-