Как мне двойной буфер панели? - PullRequest
16 голосов
/ 04 мая 2009

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

EDIT:

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

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

Ответы [ 5 ]

23 голосов
/ 04 мая 2009

Вы должны быть получены из 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();
    }
}
11 голосов
/ 22 июля 2015

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

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

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

5 голосов
/ 11 ноября 2013

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

public class DoubleBufferedPanel : Panel
{        
    [DefaultValue(true)]
    public new bool DoubleBuffered
    {
        get
        {
            return base.DoubleBuffered;
        }
        set
        {
            base.DoubleBuffered = value;
        }
    }
}
5 голосов
/ 04 мая 2009

Панели Winform имеют свойство DoubleBuffered .

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

0 голосов
/ 15 марта 2019

Просто подробно остановившись на ответе 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
...