Подтвердить что ты не робот

Как удвоить буфер панели в С#?

У меня есть панель, на которой есть рулетка, и мне нужно удвоить буфер панели, чтобы она перестала мерцать. Может ли кто-нибудь помочь мне?

~ Т-Фокс

EDIT:

Да, я пробовал это.

panel1.doublebuffered не существует, только this.doublebuffered. И мне не нужно буферизировать форму, просто панель.

4b9b3361

Ответ 1

Вам нужно извлечь из панели или 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();
    }
}

Ответ 2

Другой способ сделать это - вызывать элемент doublebuffered, используя метод InvokeMember:

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

Таким образом, вам не нужно создавать подкласс

Ответ 3

У панелей Winform есть свойство DoubleBuffered.

Изменить: я должен был заметить, что он защищен. Другие описали, как подклассифицировать его.:)

Ответ 4

Вы можете сделать публикацию DoubleBuffered -Property в разделенном классе Panel:

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