How do I double buffer a Panel?

僤鯓⒐⒋嵵緔 提交于 2019-11-26 09:42:53

问题


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.


回答1:


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();
    }
}



回答2:


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




回答3:


You can make the DoubleBuffered-Property public in a derivided class of Panel:

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



回答4:


Winform panels have a DoubleBuffered property.

Edit: I should have noticed that it was protected. Others have described how to sub-class it. :)




回答5:


Just expanding on User79775's answer, if you're trying to achieve this in VB.net, do so like this:

Imports System.Windows.Forms

Public Class MyDisplay
    Inherits Panel

    Public Sub New()
        Me.DoubleBuffered = True

        ' or

        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        UpdateStyles()
    End Sub
End Class


来源:https://stackoverflow.com/questions/818415/how-do-i-double-buffer-a-panel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!