c# winforms doublebuffered

c# - ¿Cómo hago doble buffer en un panel?



winforms doublebuffered (5)

Los paneles de Winform tienen una propiedad DoubleBuffered .

Edit: Debería haber notado que estaba protegido. Otros han descrito cómo subclasificarlo. :)

Tengo un panel que tiene una rueda de ruleta en él, y necesito duplicar el panel para que parpadee. ¿Puede alguien ayudarme?

EDITAR:

Sí, lo he intentado.

panel1.doublebuffered no existe, solo this.doublebuffered. Y no necesito guardar el Formulario, solo el Panel.


Necesita derivar de Panel o PictureBox.

Hay ramificaciones a esto dependiendo de cómo elija habilitar el almacenamiento en búfer.

Si establece el indicador this.DoubleBuffer, entonces debería estar bien.

Si actualiza los estilos manualmente, entonces debe pintar el formulario usted mismo en WM_PAINT.

Si realmente te sientes ambicioso, puedes mantener y dibujar tu propio búfer de respaldo como un mapa de bits.

using System.Windows.Forms; public class MyDisplay : Panel { public MyDisplay() { this.DoubleBuffered = true; // or SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); } }


Otra forma de hacer esto es invocar al miembro con doble memoria, usando el método InvokeMember:

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

Al hacerlo de esta manera, no tienes que crear una subclase


Puede hacer que la DoubleBuffered haga pública en una clase derivada del Panel :

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


Solo ampliando la respuesta de User79775, si estás tratando de lograr esto en VB.net, hazlo así:

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