PictureBoxen überlagern
-
Guten Tag,
ich arbeite momentan an einem Programm zum Bearbeiten von Vektorgrafiken. Gezeichnet werden ein Raster, die Objekte und ein Auswahlrahmen. Wenn ich aber z.B. ein Objekt skalieren will, muss ich den Auswahlrahmen beim MouseMove-Event ständig neuzeichnen, was aber auch bedeutet, dass alles neugezeichnet werden muss. Ich habe mir nun überlegt, die unterschiedlichen Layer auf verschiedene PictureBoxen zu verteilen und überlagern, um einen Performancegewinn zu erzielen. Meine Vermutung war, dass ich nur die PictureBox neuzeichnen muss, auf der sich der Auswahlrahmen befindet.
Im OnLoad-Event habe ich folgenden Code stehen, um die PictureBoxen zu überlagern://PictureBoxen transparent machen pbLayerObjekte.BackColor = Color.Transparent; pbLayerAuswahl.BackColor = Color.Transparent; //PictureBoxen überlagern pbLayerRaster.Controls.Add(pbLayerObjekte); pbLayerObjekte.Controls.Add(pbLayerAuswahl);
Wenn ich also nur die Auswahl neuzeichnen will, rufe ich pbLayerAuswahl.Refresh() auf.
Problem ist aber, dass komischerweise immernoch alle PictureBoxen "gepainted" werden, sobald ich nur eine bestimmte refreshen will.Hat einer von euch eine Ahnung, ob ich irgendetwas falsch mache, oder ob sowas überhaupt funktionieren kann? Oder gibt es vielleicht eine andere Möglichkeit für einen Performance-Gewinn?
-
Man sollte nie Performance-Optimierungen über Vermutungen machen. Wenn du ein Control A auf das Control B setzt und das Control A verschiebst, muss sich nicht nur Control A neu zeichnen sondern auch Control B, um die bisher verdeckten Bereiche darzustellen.
Was du somit vor hast, kann nicht funktionieren. Wie soll das überhaupt gehen? Wie stellst du dir das vor?Was du machen kannst, ist ein Double-Buffer einzurichten. Statt dass du jeweils alles neu zeichnest, zeichnest du alles in ein Bitmap. Dann musst du quasi nur das Bitmap an die entsprechenden Stellen kopieren, welche neu gezeichnet werden müssen. Damit fällt die ganze Logik beim Neu-Zeichnen weg und es müssen nur Pixel kopiert werden.
Grüssli
-
Gut vielen Dank für die Antwort. Werde mir das zu Herzen nehmen.
Gruß Ape
-
Und vergiss PictureBoxen für diese Anwendung.
Leite Dein Control von System.Windows.Forms.Control ab und implementiere die ganze Zeichnerei in der überladenen OnPaint()-Methode.
Wenn's nachher immer noch zu langsam zeichnet, kannst du auch Invalidate() mit Parametern aufrufen, die die neu zu zeichnende Region angeben. Da müsstest Du dann die alten Auswahlrahmen-Kanten und die neuen Auswahlrahmen-Kanten zu einer neuen Region verschmelzen. Das wird sich aber nur bei Auswahlrahmen lohnen, die sehr aufwändigen Inhalt umschließen.