Drawline Methode für dauerhaftes zeichnen



  • Hallo,

    gibt es eine Möglichkeit Linien statisch zu zeichnen?
    Ich möchte ein paar wenige Linien verändern und die meisten
    konstant lassen. Wenn ich alle erneuere flackerts!

    Thx für jeden Tipp!



  • Wenns flackert kannst Du double buffering verwenden - Google danach.



  • Hey, danke für die Antwort!

    Hab mir das jetzt angesehen. Jetzt möchte ich doublebuffering
    auf ein Panel anwenden, was ja nicht so ohne weiteres geht.
    Habe mir also:
    1.)eine Klasse von Panel abgeleitet und im Konstruktor auf doublebuffered gestellt
    2.)übergebe einem Objekt der Klasse die Werte von meinem Panel aus dem Designer
    3.)tausche panel vom Designer gegen das neue Panel aus

    So jetzt passieren zwei komische sachen:

    1.)Es flackert die Zeichnung immer nur beim redrawn kurz auf um dann sofort wieder
    zu verschwinden.
    2.)Wenn ich an der abgeleiteten Klasse NICHTS verändere (also kein doublebuffered
    im Konstruktor einstelle) funktionierts schonmal viel besser als mitm Standardpanel 😕



  • Wie hast Du das Double Buffering realisiert?

    Das Property des Controls genutzt?



  • Ich habe dies in den Konstruktor geschrieben.

    public:
    PanelFlackerfrei::PanelFlackerfrei()
    {
    this->SetStyle(
    AllPaintingInWmPaint,
    UserPaint,
    DoubleBuffer,
    true)
    }
    


  • P. Farnsworth schrieb:

    2.)Wenn ich an der abgeleiteten Klasse NICHTS verändere (also kein doublebuffered
    im Konstruktor einstelle) funktionierts schonmal viel besser als mitm Standardpanel 😕

    Okay, das nehm ich wieder zurück. War nur weil der Pc vorhin ausgelasteter
    war. Sonst wär auch irgendwie mein Weltbild zusammengebrochen :).



  • hey, hat den niemand einen Tipp für mich?

    Das doublebuffered verhält sich wenn ich die property belege, als auch
    wenn ich es über die Funktion SetStyle einstelle gleich.

    Was mache ich falsch?



  • Schau dir mal an wo dein Paint aufgerufen wird. IMHO ist double buffering sowieso schon angeschalten bei den meisten controls. Flackereffekte kommen auch zustande wenn man Zustände zeichnet die man nicht beachtet hat. Z.B. kann das passieren wenn man ein Refresh aufruft nachdem man die "ZuZeichnen"-Liste geleert hat. Ggf wäre etwas Code der OnPaint Methode hilfreich bzw noch ein auflistung wann du ein Repaint des Controls selbst auslöst. Allgemein habe ich feststellen müssen das .Net das Doublebuffering der Controls meist recht gut im Griff hat. Eine eigene DoubleBuffering Implementation ist da selten notwendig.



  • Hey Fedaykin!

    Dankeschön! Sieht jetzt alles wunderbar aus.
    Onpaintmethode war das Stichwort. War mir nicht ganz klar, dass das
    was anderes als die Paintmethode ist. Wozu braucht man diese dann?

    Viele Grüße!



  • Paint ist AFAIK das Ereignis welches ausgelöst wird (Eine reine Paint methode für Forms kenne ich gar nicht). OnPaint ist die Methode die dabei gerufen wird. Jetzt kann ich aber nicht genau sagen wann genau was passiert d.H. ich weiß nicht ob erst Paint Ausgelöst wird und dann OnPaint aufgerufen wird. Oder erst OnPaint gerufen wird und danach Paint ausgelöst wird. Eigentlich sollte es trotz allem dadurch auch nicht zum Flackern kommen, warum das wirkliche geflackert hat kann ich also auch nicht sagen, da würde maximal der Quellcode helfen. Irgendwo wurde halt mal zu viel (oder zu wenig) gezeichnet.



  • Ich tippe auf ein Invalidate bzw. Refresh o.ä in der Paint-Methode...



  • Würde das nicht eine Endlos Rekursion und damit einen Stack Overflow geben?



  • Hehe, nee das wars nicht. Habs eben mal ausprobiert -> Flackern bekomm ich
    damit nicht, aber eine hübsche Prozessorauslastung ;).

    Jetzt hab ichs auch hinbekommen in dem Paintevent vernünftig zu zeichnen...
    Ich habe vorher statt dem PaintEvent->Graphics ein Grafikobjekt benutzt,
    was ich mir als Member definiert und im Konstruktor mit panel->CreateGraphics()
    erstellt hab.
    Das wurde mir mal gezeigt dass man dass so machen soll 🙄.



  • Zeichne bitte im Paint-Event... sonst ist es nicht _dauerhaft_


Log in to reply