Laden...

Graphics.Clear() Alternative?

Erstellt von Andreas@Tricept vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.379 Views
A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren
Graphics.Clear() Alternative?

Hallo,
derzeit versuche ich ein wenig das Zeichnen zu lernen und habe ein Problem, bei mir die Suche und auch das Buch was ich zum Lernen benutze nicht weiterhelfen kann.

Und zwar handelt es sich hier um ein simples Beispiel:
Ich habe das OnPrint Event überschrieben.


        int abstand = 20;

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            
            Graphics g = this.CreateGraphics();
            g.Clear(Color.White);
            Pen p = new Pen(Color.Black, 3);
            g.DrawLine(p, abstand, Height - abstand, Width - abstand, Height - abstand);

            for (int i = abstand; i <= (Width - abstand*2); i = i + abstand)
            {
                g.DrawLine(p, i, Height - (abstand - 10), i, Height - (abstand+10));
            }
        }

Und zwar habe ich das Problem das wenn ich die Größe der Gui verändere, dass er mir nicht mein altes Gezeichnetes rauswirft, nun habe ich die Methode g.Clear() gefunden, mit dieser flackert jedoch das Bild bei jedem neu Zeichnen und außerdem wenn ich die Form kleiner Ziehe wird nicht neu gezeichnet, erst dann wenn ich wieder nen milimeter größer schiebe. Gibt es dafür vielleicht eine bessere Methode?

Gelöschter Account
vor 16 Jahren

das flackern bekommst du mit der setstyle eigenschaft weg und das problem mit dem resizen bekommst du weg wenn du das event onresize mit einem this.refresh() behandelst.

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Vielen Dank schonmal.
Es gibt das Style ResizeRedrow, da müsste ich auch nicht die OnResize Methode überschreiben, jedoch krieg ich davon das Flackern nicht weg.

1.271 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

Stichwort: DoubleBuffered

Gruß,
Thomas

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Wenn ich Doublebuffered auf true setze habe ich keinen Gewinn.
Erstens wird mein Gezeichnetes nach dem Rezise gelöscht, zweitens wenn ich die OnResize Methode überschreibe und ein Refresh erzwinge, flackert es stärker als zuvor.

Der Stylemode ResizeRedrow war bisher am besten, wenn es auch ganz leich flackert bei Veränderungen der Größe.

Y
238 Beiträge seit 2005
vor 16 Jahren

Erstens sollst du im überschriebenen OnPaint ausschliesslich das Graphics-Object aus den PaintEventArgs verwenden. Zweitens, alle verwendeten Pens und Brushes vor verlassen der OnPaint-Methode disposen. Und Drittens, solltest du den Vorschlag vom progger wenigstens mal ausprobieren, bevor du behauptest dass es nicht funktioniert. Er kennt sich mit GDI+ bestens aus und hat mit DoubleBuffering höchstwarscheinlich Recht.

PS: Im Forum gibt es von herbifore ein gutes Tutorial zu diesem Thema.

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Das Tutorial habe ich mir durchgelesen und im Anschluss mit einem Buch weitergemacht.
Deine Anregungen hören sich gut an, werde ich gleich mal umsetzen.

Aber, wie kannst du mir unterstellen den Doublebuffer nicht selber getestet zu haben, wenn du dir nichtmal selber die Mühe gemacht hast es auszuprobieren.

Bei manchen Posts die ich mir hier durchlese denke ich wirklich manchmal, Änfänger werden wegen ihrem Wissensstand direkt in eine Schublade geschoben, Vorurteile werden gebildet und anhand dessen provokative oder ernidrigende Textzeilen verfasst.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

Aber, wie kannst du mir unterstellen den Doublebuffer nicht selber getestet zu haben, wenn du dir nichtmal selber die Mühe gemacht hast es auszuprobieren.

wo unterstellt er das? Er sagt ja nur, dass DoubleBuffering - wenn man es richtig verwendet - die Probleme meistens löst. Das ist doch ein guter und wichtiger Tipp und für dich der Hinweis, dass du überprüfen solltest, ob du es richtig angewendet hast. DoubleBuffer muss man immer für das Control setzen, in das man zeichnet.

Bei manchen Posts die ich mir hier durchlese denke ich wirklich manchmal, Änfänger werden wegen ihrem Wissensstand direkt in eine Schublade geschoben, Vorurteile werden gebildet und anhand dessen provokative oder ernidrigende Textzeilen verfasst.

Das sehe ich überhaupt nicht so. Im Gegenteil wir helfen jeden Tag vielen Anfängern ihre Probleme zu lösen. Es wäre natürlich sehr schade und auch nicht beabsichtigt, wenn du den Hinweis auf fehlenden Grundlagen oder die Bitte zum Selbststudium als provokativ oder erniedrigend empfindest. So sind solche Aussagen nicht gemeint, sondern rein sachlich, wie in Community-Regeln :

Auf der anderen Seite ist myCSharp.de kein reines Anfängerforum. Wir setzen grundlegende Kenntnisse voraus, zum Beispiel über den Aufbau von Windows-Forms-Anwendungen. Solche grundlegenden Kenntnisse erwirbt man leichter und besser, wenn man ein Buch durcharbeitet. Anfänger sollten daher akzeptieren, wenn sie bei zu grundlegenden Fragen auf das Selbststudium verwiesen werden.

herbivore

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 16 Jahren

Original von herbivore
wo unterstellt er das?

Hier:

Original von yngwie
solltest du den Vorschlag vom progger wenigstens mal ausprobieren

Original von herbivore
Das sehe ich überhaupt nicht so. Im Gegenteil wir helfen jeden Tag vielen Anfängern ihre Probleme zu lösen.

Ich hab ja auch nicht das Gegenteil behauptet, die Qualität der Hilfe ist hier auch gut, das ist auch die erste Adresse wo ich nach Lösungen für meine Probleme suche, im Anschluss Google und dann ein Beitrag.
Der letze Beitrag von yngwie war ja auch richtig nützlich für mich, nur die Art und Weiße wie er diese sinnvollen Informationen an mich weitergegeben hat, das hat mir missfallen.

Aber ich will hier ja nicht streiten wollte nur ein wenig auf die Toleranz appellieren, weil mir halt dieses kleine formelle Problem in anderen Threads öfter aufgefallen ist.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

solltest du den Vorschlag vom progger wenigstens mal ausprobieren

da du in dem Beitrag davor geschrieben hast, dass du DoubleBuffered ausprobiert hast, wird yngwie das schlicht überlesen haben. Ich kann darin nach wie vor keine Provokation sondern höchstens einen Irrtum erkennen. Man kann aber Provokationen auch in Antworten hineinlesen, wo keine sind. Ich möchte daher an deine Toleranz appellieren. Solange du die Hilfe bekommst, die du brauchst, nimm sie bitte so, wie sie kommt. Gehe immer davon aus, dass jemand der dir hilft, es gut mit dir meint.

herbivore

Y
238 Beiträge seit 2005
vor 16 Jahren

Hallo Andreas@Tricept,

ich wollte dich weder erniedrigen noch mit irgendetwas abstempeln sondern nur knapp und präzise auf mögliche Fehlerquellen hinweisen. Mir ist auch klar dass jeder Mensch den gleichen Text unterschiedlich interpretiert bzw. darauf reagiert. Anscheinend gehörst du in dieser Hinsicht zu den empfindlicheren...

Wenn ich Doublebuffered auf true setze habe ich keinen Gewinn.

Die betreffende Passage in deinem Beitrag hat sich für mich (rein subjektiv) so angehört als wolltest du DoubleBuffering, trotz eines berechtigten Ratschlages vom progger gar nicht ausprobieren, weil du aufgrund irgendwelcher logischen Überlegungen überzeugt warst, dass es nichts bringen kann. Wahrscheinlich habe ich ab dieser Stelle auch nicht mehr gründlich genug weitergelesen...

PS: Ich persönlich habe mich schon längst daran gewöhnt dass in Foren sehr oft missverstanden, überlesen und falsch
interpretiert wird und versuche da möglichst nicht zu dünnhäutig zu sein.

Gut dass wir darüber gesprochen haben🙂

1.378 Beiträge seit 2006
vor 16 Jahren

Ich frage mich gerade, ob du in der Form


DoubleBuffered=true; 

gesetzt hast, oder im Control indem du zeichnest die Methode


SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

aufgerufen hast. Ersteres bringt nämlich nichts.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo xxxprod,

was hat die SetStyle-Methode für einen Vorteil gegen über dem direkten Setzen von DoubleBuffered? Beide sind protected.

herbivore

PS: Dass man dabei beides auf das richtige Control anwenden muss, ist schon klar.

1.378 Beiträge seit 2006
vor 16 Jahren

Keine Ahnung wahrscheinlich aus der Situation heraus, dass die Eigenschaft DoubleBuffered nur in Forms zur Verfügung steht und ich angenommen habe das er in einem eigenen Control zeichnet.
Ich habe selbst auch noch nie in der Form gezeichnet sondern immer nur in Panels und dort hat mir die Eigenschaft nichts gebracht.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo xxxprod,

ok, verstehe.

DoubleBuffered ist jedoch eine Eigenschaft von Control und steht daher in allen Controls zur Verfügung nicht nur in Forms. Mag sein, dass IntelliSense die Eigenschaft nur für Forms anzeigt, aber das will ja nichts heißen, denn geben tut es die Eigenschaft für alle Controls.

herbivore

1.378 Beiträge seit 2006
vor 16 Jahren

ok ich verlass mich anscheinend zu sehr auf IntelliSense 🙂