Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

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

Moderationshinweis von herbivore (23.12.2013 - 10:01)

Der Originaltitel war: "Nicht alles neuzeichnen"

OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1.361
Herkunft: Berlin

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.432

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

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();

Moderationshinweis von herbivore (23.12.2013 - 09:58)

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

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
OhThereIsAPeanut
myCSharp.de - Member



Dabei seit:
Beiträge: 33

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers