2009-05-04 6 views
16

Ho un pannello con una ruota della roulette e ho bisogno di raddoppiare il pannello in modo che smetta di lampeggiare. Qualcuno mi può aiutare?Come faccio a raddoppiare il buffer di un pannello in C#?

~ T-Fox

EDIT:

Sì, ho provato.

panel1.doublebuffered non esiste, solo questo.doublebuffered. E non ho bisogno di bufferizzare il modulo, solo il pannello.

+1

Pannello * * ha una proprietà DoubleBuffered (JP collegata al documento per questo). Si noti che la proprietà è protetta, motivo per cui non è possibile raggiungerla. Crea una sottoclasse di Panel e impostala nel costruttore. – Andy

+1

Forse questo è un non-problema per gli altri, ma l'impostazione del valore in 'InitializeComponent' provoca il crash del progettista; come menzionato da @Andy, fallo nel costruttore. – Dan

risposta

5

I pannelli di Winform hanno uno DoubleBuffered property.

Modifica: avrei dovuto notare che era protetto. Altri hanno descritto come sottoclasse. :)

22

È necessario derivare da Panel o PictureBox.

Ci sono delle ramificazioni a seconda di come si sceglie di abilitare il buffering.

Se si imposta il flag this.DoubleBuffer, si dovrebbe essere ok.

Se si aggiornano manualmente gli stili, è necessario colorare il modulo da soli in WM_PAINT.

Se ti senti davvero ambizioso, puoi mantenere e disegnare il tuo buffer di riserva come bitmap.


using System.Windows.Forms; 

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

     // or 

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

Grazie per aver postato la risposta. –

+0

PictureBox AFAIK è comunque a doppio buffer. – TaW

5

si può fare il pubblico -Property DoubleBuffered in una classe di derivided Panel:

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

Poiché non c'è alcun senso nell'usare questa classe tranne * con * double buffering on, lo renderemmo ancora più semplice: 'class DoubleBufferedPanel: Panel {public DoubleBufferedPanel(): base() { DoubleBuffered = true; }} '. –

+0

Molto semplice, davvero. Dopo aver aggiunto questo one-liner al mio progetto, tutto quello che dovevo fare era andare al Designer e cambiare il tipo di dati del pannello in questione in due punti e tutto va bene ora .. Molto bello! – TaW

9

Un altro modo per farlo è quello di richiamare il membro DoubleBuffered, utilizzando il metodo InvokeMember:

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

In questo modo, non è necessario creare una sottoclasse

Problemi correlati