2009-05-04 4 views
16

Ich habe ein Panel, das ein Rouletterad hat, und ich muss das Panel doppelt puffern, so dass es zu flackern aufhört. Kann mir jemand helfen?Wie puffere ich ein Panel in C# doppelt?

~ T-Fox

EDIT:

Ja, ich habe das versucht.

panel1.doublebuffered existiert nicht, nur this.doublebuffered. Und ich muss das Formular nicht puffern, nur das Panel.

+1

Panel * does * hat eine DoubleBuffered-Eigenschaft (JP ist mit dem doc verknüpft). Beachten Sie, dass die Eigenschaft geschützt ist, weshalb Sie nicht darauf zugreifen können. Erstellen Sie eine Unterklasse von Panel und legen Sie sie im Konstruktor fest. – Andy

+1

Vielleicht ist dies kein Problem für andere, aber wenn der Wert in 'InitializeComponent' gesetzt wird, stürzt der Designer ab; Wie von @Andy erwähnt, tun Sie es im Konstruktor. – Dan

Antwort

5

Winform Platten haben eine DoubleBuffered property.

Edit: Ich sollte bemerkt haben, dass es geschützt war. Andere haben beschrieben, wie man sie untergliedert. :)

22

Sie müssen von Panel oder PictureBox ableiten.

Je nachdem, wie Sie die Pufferung aktivieren, ergeben sich daraus Konsequenzen.

Wenn Sie das This.DoubleBuffer-Flag festlegen, sollten Sie in Ordnung sein.

Wenn Sie die Stile manuell aktualisieren, müssen Sie das Formular in WM_PAINT selbst erstellen.

Wenn Sie sich wirklich ehrgeizig fühlen, können Sie Ihren eigenen Backbuffer als Bitmap beibehalten und zeichnen.


using System.Windows.Forms; 

public class MyDisplay : Panel 
{ 
    public MyDisplay() 
    { 
     this.DoubleBuffered = true; 

     // or 

     SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     UpdateStyles(); 
    } 
} 
+0

Danke für die Antwort. –

+0

AFAIK PictureBox ist sowieso doppelt gepuffert .. – TaW

5

können Sie machen die DoubleBuffered -Property Öffentlichkeit in einer derivided Klasse von Panel:

public class DoubleBufferedPanel : Panel 
{   
    [DefaultValue(true)] 
    public new bool DoubleBuffered 
    { 
     get 
     { 
      return base.DoubleBuffered; 
     } 
     set 
     { 
      base.DoubleBuffered = value; 
     } 
    } 
} 
+7

Da es keinen Sinn macht, diese Klasse außer * mit * double buffering zu verwenden, würde ich es noch einfacher machen: 'class DoubleBufferedPanel: Panel {public DoubleBufferedPanel(): base() { DoubleBuffered = wahr; }} '. –

+0

Sehr einfach, in der Tat. Nachdem ich diesen One-Liner zu meinem Projekt hinzugefügt hatte, musste ich nur noch zum Designer gehen und den Datatype des fraglichen Panels an zwei Stellen ändern und jetzt ist alles in Ordnung. Sehr cool! – TaW

9

Ein anderer Weg, dies zu tun, ist das Mitglied DoubleBuffered aufzurufen, die InvokeMember Methode:

typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty  
      | BindingFlags.Instance | BindingFlags.NonPublic, null, 
      panel2, new object[] { true }); 

Auf diese Weise müssen Sie keine Unterklasse erstellen