如何双重缓冲面板?

时间:2009-05-04 00:34:03

标签: c# winforms doublebuffered

我有一个面板上有一个轮盘赌轮,我需要对面板进行双重缓冲,以免它停止闪烁。任何人都可以帮助我吗?

编辑:

是的,我试过了。

panel1.doublebuffered不存在,只有this.doublebuffered。而且我不需要缓冲表单,只需要Panel。

5 个答案:

答案 0 :(得分:23)

您需要从Panel或PictureBox派生。

这取决于您选择启用缓冲的方式。

如果设置this.DoubleBuffer标志,那么你应该没问题。

如果手动更新样式,则必须自己在WM_PAINT中绘制表单。

如果您真的有野心,可以将自己的后台缓冲区维护并绘制为位图。


using System.Windows.Forms;

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

        // or

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

答案 1 :(得分:11)

另一种方法是使用InvokeMember方法调用成员doublebuffered:

catch

通过这种方式,您不必创建子类

答案 2 :(得分:5)

Winform面板有一个DoubleBuffered property

编辑:我应该注意到它受到了保护。其他人已经描述了如何对它进行分类。 :)

答案 3 :(得分:5)

您可以在DoubleBuffered的派生类中公开Panel - 属性:

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

答案 4 :(得分:0)

只需扩展User79775的答案,如果您想在VB.net中实现此目标,就可以这样做:

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