Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I double buffer a Panel?

I have a panel that has a roulette wheel on it, and I need to double buffer the panel, so that it stops flickering. Can anyone help me out?

EDIT:

Yes, I have tried that.

panel1.doublebuffered does not exist, only this.doublebuffered. And I don't need to buffer the Form, just the Panel.


2 Answers

Another way of doing this is to invoke the member doublebuffered, using the InvokeMember method:

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

By doing it this way, you don't have to create a subclass

like image 183
Jakob Danielsson Avatar answered Sep 12 '25 07:09

Jakob Danielsson


You need to derive from Panel or PictureBox.

There are ramifications to this depending on how you choose to enable the buffering.

If you set the this.DoubleBuffer flag then you should be ok.

If you manually update the styles then you have to paint the form yourself in WM_PAINT.

If you really feel ambitious you can maintain and draw your own back buffer as a Bitmap.


using System.Windows.Forms;

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

        // or

        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        UpdateStyles();
    }
}
like image 21
user79755 Avatar answered Sep 12 '25 09:09

user79755