Announcement

Collapse
No announcement yet.

GDI+ beschleunigen - Interna von Panel.Invalidate()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GDI+ beschleunigen - Interna von Panel.Invalidate()

    Hallo Experten,

    kann mir jemand erklären, unter welchen Bedingungen die OnPaint()-Methode eines Panels aufgerufen wird?

    Der Hintergrund ist der:

    Ich habe ein Objekt von Panel abgeleitet, auf dem ich einige Objekte zeichne und das scrollbar ist.

    Die Objekte sind keine Controls, sie enthalten lediglich Farben und Koordinaten in Form von Punkten und Pfaden. Ihre Methode Draw() wird mit den PaintEventArgs aus MyPanel.OnPaint() aufgerufen. Die Objekte sind verform- und verschiebbar.

    Wenn mehr als ein Dutzend dieser Objekte existiert, dann geht das Verschieben der Objekte nicht mehr flüssig. Das Ruckeln wird stärker, je mehr Objekte auf dem Panel liegen.

    Die Koordinaten im Objekt werden beim Verschieben neu berechnet. Ich möchte nun die Rechenlast senken, indem nur das neu gezeichnet wird, was sich verändert hat. Aber in einem Test werden ständig alle Objekte neu gezeichnet, auch ohne einen aufruf von Panel.Invalidate() meinerseits.

    Nach welchem Schema wird Panel.Invalidate() systemseitig aufgerufen?

    Mit freundlichem Gruß,


    luker

  • #2
    Hallo luker,

    in Windows ist das Zeichenmodell so dass Windows den Controls mitteilt was gezeichnet werden muss -> Inversion of Control (als Grundbestandteil eines Frameworks).

    So ist das auch hier. Werden zB 2 Fenster teilweise übereinandergelgt so wird von jedem Fenster nur der Teil gezeichnet der auch sichtbar ist und nicht alles

    Somit kann das Zeichnen verschnellert werden wenn im Code auch nur das gezeichnet wird was soll. Dazu gibts mit den PaintEventargs die ClipRectangle-Eigenschaft.

    Nach welchem Schema wird Panel.Invalidate() systemseitig aufgerufen?
    Indem das ClipRectangle übergeben wird.


    BTW: Eventuell ist auch DoubleBuffered ein Hilfsmittel.
    [highlight=c#]
    public class MyPanel : Panel
    {
    public MyPanel()
    {
    this.DoubleBuffered = true;
    }
    }
    [/highlight]
    (wegen protected der Eigenschaft)



    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment

    Working...
    X