2009-05-04 13 views
16

Mam panel, który ma koło ruletki i muszę podwoić bufor panelu, aby przestał migotać. Czy ktoś może mi pomóc?Jak podwójnie buforować Panel w C#?

~ T-Fox

EDIT:

Tak, próbowałem tego.

panel1.doublebuffered nie istnieje, tylko this.doublebuffered. I nie potrzebuję buforować formularza, tylko panel.

+1

Panel * does * ma właściwość DoubleBuffered (JP powiązany z dokumentem dla niej). Należy pamiętać, że właściwość jest chroniona, dlatego nie można się do niej dostać. Utwórz podklasę panelu i ustaw ją w konstruktorze. – Andy

+1

Być może nie jest to problem dla innych, ale ustawienie wartości w 'InitializeComponent' powoduje awarię projektanta; jak wspomniano przez @Andy, zrób to w konstruktorze. – Dan

Odpowiedz

5

Panele Winform mają DoubleBuffered property.

Edytuj: Powinienem był zauważyć, że był chroniony. Inni opisali, jak je podklasować. :)

22

Musisz wywodzić się z Panelu lub PictureBox.

Istnieją konsekwencje tego działania w zależności od sposobu włączenia buforowania.

Jeśli ustawisz flagę This.DoubleBuffer, powinieneś być w porządku.

Jeśli ręcznie aktualizujesz style, musisz samemu pomalować formularz w WM_PAINT.

Jeśli naprawdę czujesz się ambitny, możesz zachować i narysować własny bufor zwrotny jako 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

Dziękujemy za zamieszczenie odpowiedzi. –

+0

AFAIK PictureBox jest podwójnie buforowany. – TaW

5

Można dokonać DoubleBuffered -property publicznej w derivided klasy Panel:

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

Ponieważ używanie tej klasy nie ma sensu, z wyjątkiem * z * podwójnym buforowaniem, sprawiłbym, że byłoby jeszcze prostsze: 'class DoubleBufferedPanel: Panel {public DoubleBufferedPanel(): base() { DoubleBuffered = true; }} '. –

+0

Bardzo proste, w rzeczy samej. Po dodaniu tego jednego liniowca do mojego projektu, wszystko, co musiałem zrobić, to przejść do Projektanta i zmienić typ danych panelu w dwóch miejscach i wszystko jest już dobrze .. Bardzo fajne! – TaW

9

Innym sposobem na to jest, aby wywołać członek DoubleBuffered metodą InvokeMember:

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

Robiąc to w ten sposób, nie trzeba tworzyć podklasy