Laden...

Farbverlauf wird bei Größenänderungen des Controls nicht durchgehend gezeichnet

Erstellt von DellaRocco vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.240 Views
Thema geschlossen
D
DellaRocco Themenstarter:in
15 Beiträge seit 2008
vor 13 Jahren
Farbverlauf wird bei Größenänderungen des Controls nicht durchgehend gezeichnet

Hallo,

ich habe vor einiger Zeit mal hier von einem User ein Snippet für einen Farbverlauf (WinForms) gesehen, den ich jetzt benutzen wollte.


if ((ClientSize.Width == 0) || (ClientSize.Height == 0)) return;
            Color farbe1 = new Color();
            Color farbe2 = new Color();
            farbe1 = Color.FromArgb(227, 239, 255);
            farbe2 = Color.FromArgb(175, 210, 255);
            LinearGradientBrush linearBrush = new LinearGradientBrush(new Point(300, 0),
            new Point(300, ClientSize.Height), farbe1, farbe2);
            e.Graphics.FillRectangle(linearBrush, 0, 0, ClientSize.Width, ClientSize.Height);

Diesen Snippet habe ich also ins Paint-Event der Form eingefügt, was auch wunderbar klappt. Nur mein Problem ist jetzt, wenn ich die Form größer und kleiner ziehe, sieht man auf der Form so Rechtecke, als wenn er immer wieder die Form überzeichnet oder so ähnlich!?

Habt ihr ne Idee, wie man diesen Effekt vermeiden kann bzw. wie er den Farbverlauf ganz normal anpasst, wenn die Größe der Form ändert zur Laufzeit?

Vielen Dank!

Gruß
DellaRocco

A
69 Beiträge seit 2010
vor 13 Jahren

Du musst im Konstruktor des abgeleiteten Controls mit SetStyle die Option ResizeRedraw auf true stellen oder aber im abonnierten Resize Event ein Invalidate auf die gesamte Zeichenfläche ausführen.

D
DellaRocco Themenstarter:in
15 Beiträge seit 2008
vor 13 Jahren

Danke für deine Antwort, es klappt auch soweit!

Nur wenn ich es nun größer oder kleiner ziehe, flackert die Oberfläsche doch extrem stark. Durch das Setzen von "this.DoubleBuffered = true;" flackert es zwar nicht mehr ganz so schlimm, aber sehen tut man es leider immer noch.

Gruß
DellaRocco

A
69 Beiträge seit 2010
vor 13 Jahren

Ja, das wirst du in GDI+ auch nicht wirklich abstellen können, da du wegen dem Farbverlauf die komplette Zeichenfläche neu zeichnen musst (Farbverlauf verschiebt sich ja...). Alternativ kannst du während des Resize vorgangs die Hintergrundfarbe auf eine solide Farbe ohne Verlauf stellen und nach dem Resize den Farbverlauf wieder setzen. Das erfordert ein wenig Code, ist aber gut machbar.

Ansonsten musst du auf WPF ausweichen, um das flüssig hinzubekommen.

3.825 Beiträge seit 2006
vor 13 Jahren

Ich prüfe jede Sekunde ob ein Resize stattgefunden hat und wenn ja wird der gesamte Verlauf neu gezeichnet.

So geht Resize schnell und flüssig und das Form sieht dann nach einer Sekunde gut aus.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

D
DellaRocco Themenstarter:in
15 Beiträge seit 2008
vor 13 Jahren

Wie machst du das genau, wenn ich fragen darf?

Gruß
DellaRocco

A
69 Beiträge seit 2010
vor 13 Jahren

Dann verwende besser ein Delay, den du beim Resize startest und immer wieder neu resettest und wenn der einmal doch abläuft, machst du ein invalidate. Das ist bei weitem ressourcenschonender als ein Timer der jede sekunde auf eine änderung prüft.

D
DellaRocco Themenstarter:in
15 Beiträge seit 2008
vor 13 Jahren

Dann verwende besser ein Delay, den du beim Resize startest und immer wieder neu resettest und wenn der einmal doch abläuft, machst du ein invalidate. Das ist bei weitem ressourcenschonender als ein Timer der jede sekunde auf eine änderung prüft.

Könntest du mir vielleicht einmal zeigen, wie du das genau meinst?

Gruß
DellaRocco

Hinweis von herbivore vor 13 Jahren

Etwas Eigeninitative erwarten wir schon. Du hast jetzt ja alle Stichworte, die du brauchst.

Thema geschlossen