Laden...

Von der Konfiguration abhängigen (dann unveränderlichen) Background nicht immer neu zeichnen

Erstellt von OhThereIsAPeanut vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.973 Views
Hinweis von herbivore vor 10 Jahren

Der Originaltitel war: "Nicht alles neuzeichnen"

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren
Von der Konfiguration abhängigen (dann unveränderlichen) Background nicht immer neu zeichnen

Hallo Leute,

ich habe eine Frage an euch.
Habe ihr eine Idee wie ich C# sagen kann, dass er in der Paint Methode eines Panels nicht alle Bereiche neuzeichnen soll? Wäre super.

Beste Grüße
OhThereIsAPeanut

1.361 Beiträge seit 2007
vor 10 Jahren

Hi OhThereIsAPeanut,

Schau mal bei [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen vorbei. Dort werden alle Themen rund ums Zeichen behandelt.

Du kannst beim Aufrufen von Invalidate(...) einen Bereich angeben, der sich verändert hat und somit das Neuzeichnen des kompletten Controls verhinden.
Gleichzeitig bekommst du in der OnPaint(...) über den PaintEventArgs Parameter (insbesondere ClipRectangle) mit, welcher Bereich neu gezeichnet werden soll.

Beste Grüße
zommi

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo OhThereIsAPeanut,

konkret "Gezieltes OwnerDrawing" - schnelles Zeichnen bewegter Objekte, in dem "nur den Bereich zeichnen, in dem das Objekt bewegt wurde" das Thema ist.

herbivore

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Also ich habe mir das jetzt einmal genauer angeschaut. Ist aber relativ schwer jetzt noch in meinem Projekt zu implementieren.
Gibt es denn keine einfachere Möglichkeit einen Background bei Start der Applikation zeichnen zu lassen?

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo OhThereIsAPeanut,

ich sehe nicht, was deine Nachfrage mit der ursprünglichen Frage zu tun hat.

Auf die Eingangsfrage gibt es aus meiner Sicht keine andere Antwort. Einfacher oder auch nur anders wird das Gefragte nicht gehen.

herbivore

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Hey,

also mir geht es eigentlich nur darum, dass ich bei Start der Applikation einen bestimmten background zeichnen möchte. Der kann je nach Konfiguration anders aussehen, deswegen kann ich kein image oder ähnliches verwenden sondern muss das ganze immer zeichnen.

Dieser Background soll sich aber während die Applikation läuft nicht mehr verändern. Nur bestimmte andere Elemente sollen auf diesen Background gezeichnet werden.

grüße
ohthereisapeanut

4.931 Beiträge seit 2008
vor 10 Jahren

Dann erstelle dir zu Beginn eine Bitmap, auf der du zeichnest und dann zeichne im Paint-Ereignis zuerst diese Bitmap mit DrawImage und anschließend deine individuellen Zeichnungen darüber.

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Danke für den Tipp. Das hat funktioniert.
Das Problem, dass ich nun allerdings habe ist, dass bei jedem neuzeichnen das bild kurz blinkt bzw flackert. Einen Tipp wie man das verhindern kann?

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Habs gelöst. Custom Panel erstellt und dann dort folgenden Code in den Konstruktor eingefügt:


base.DoubleBuffered = true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
Hinweis von herbivore vor 10 Jahren

Wie es auch in der FAQ steht: [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo OhThereIsAPeanut,

ob du den Background einmal zu Anfang in eine Bitmap zeichnest oder in (jedem) Paint neu zeichnest, macht übrigens von der Quellcodemenge keinen (nennenswerten) Unterschied. Was von beidem die bessere Performance hat, hängt von der Anzahl der für den Background zu zeichnenden Elemente ab. Sind es wenige, ist es besser (und etwas einfacher), sie einfach jedes mal neu im Paint zu zeichnen.

herbivore

O
OhThereIsAPeanut Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

Hallo Leute,

ok alles klar. Ich kann bloss nicht so richtig einschätzen was "viel" oder "wenig" Elemente heisst.
Könntet ihr da mal eine Zahl nennen?

lg ohthereisapeanut

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo OhThereIsAPeanut,

das Zeichnen der Elemente im Paint müsste schon mehr als vielleicht 1/20-1/10 Sekunde dauern (was du z.B. mit einer Stopwatch messen könntest), damit es sich performancemäßig lohnt, eine Bitmap zu verwenden.

herbivore