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

  • »
  • Community
  • |
  • Diskussionsforum
Graphics.Clear() Alternative?
Andreas@Tricept
myCSharp.de - Member



Dabei seit:
Beiträge: 289

Themenstarter:

Graphics.Clear() Alternative?

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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.
Andreas@Tricept
myCSharp.de - Member



Dabei seit:
Beiträge: 289

Themenstarter:

beantworten | zitieren | melden

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

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 289

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Andreas@Tricept am .
private Nachricht | Beiträge des Benutzers
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von yngwie am .
private Nachricht | Beiträge des Benutzers
Andreas@Tricept
myCSharp.de - Member



Dabei seit:
Beiträge: 289

Themenstarter:

beantworten | zitieren | melden

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.
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 Andreas@Tricept,
Zitat
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.
Zitat
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 :
Zitat
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
private Nachricht | Beiträge des Benutzers
Andreas@Tricept
myCSharp.de - Member



Dabei seit:
Beiträge: 289

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von herbivore
wo unterstellt er das?
Hier:
Zitat
Original von yngwie
solltest du den Vorschlag vom progger wenigstens mal ausprobieren
Zitat
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.
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 Andreas@Tricept,
Zitat
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
private Nachricht | Beiträge des Benutzers
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

ok ich verlass mich anscheinend zu sehr auf IntelliSense
private Nachricht | Beiträge des Benutzers