¿Cómo evitar el parpadeo de los controles Windows Forms C#?

publicado por: Anonymous

Siempre he notado que al usar una imagen de fondo en un formulario, panel, o algún control de usuario, se relentizan las animaciones en pantalla, lo que hace que sea un poco molesto para el usuario interactuar con el sistema.

He leido información al respecto veo que hablan de usar el DoubleBuffer pero esto no ha solucionado mi problema.

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true); 

o esto:

foreach (Control control in Controls) 
{
   typeof(Control).InvokeMember("DoubleBuffered",
   BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,null, control, new object[] { true });
}

Entonces ¿cómo hacer para que esto no suceda , hay alguna forma de reducir el tamaño de la imagen o hacerlo de una mejor manera para que no parpade?

solución

De momento esto ha solucionado mi problema aunque no es definitivo, seguí indagando y he encontrado esta respuesta a mi pregunta contestada por el usuario Hans Passant, la respuesta es de stackoverflow en inglés pero facilmente la pueden traducir si lo necesitan.

Traducción de una parte del texto original de la respuesta:

Esta es una limitación bastante fundamental de Windows Forms, está atascada con la forma en que Windows procesa Windows. Reparado por WPF por cierto, no usa Windows para controles secundarios. Lo que desearía es almacenar dos veces en el formulario completo, incluidos los controles secundarios. Es posible, revisa mi código en este hilo para la solución. Sin embargo, tiene efectos secundarios y en realidad no aumenta la velocidad de la pintura. El código es simple, pegue esto en su formulario (no en el control del usuario):

protected override CreateParams CreateParams {
  get {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
    return cp;
  }
} 

Hay muchas cosas que puede hacer para mejorar la velocidad de la pintura, hasta el punto de que el parpadeo ya no se nota. Comience abordando la imagen de fondo. Pueden ser realmente caros cuando la imagen de origen es grande y debe reducirse para ajustarse al control. Cambie la propiedad BackgroundImageLayout a "Mosaico". Si eso le da una notable aceleración, regrese a su programa de pintura y cambie el tamaño de la imagen para que concuerde mejor con el tamaño de control típico. O escriba el código en el método OnResize () de la UC para crear una copia del tamaño adecuado de la imagen para que no tenga que cambiar su tamaño cada vez que se repinte el control. Use el formato de píxeles Format32bppPArgb para esa copia, que se muestra aproximadamente 10 veces más rápido que cualquier otro formato de píxeles.

Lo siguiente que puede hacer es evitar que los agujeros sean tan perceptibles y que contrasten mal con la imagen. Puede apagar el indicador de estilo WS_CLIPCHILDREN para el UC, el indicador que impide que el UC se dibuje en el área donde van los controles secundarios. Pegue este código en el código de UserControl:

protected override CreateParams CreateParams {
  get {
    var parms = base.CreateParams;
    parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
    return parms;
  }
}

Los controles secundarios ahora se pintarán encima de la imagen de fondo. Es posible que todavía los veas pintar uno por uno, pero el feo agujero blanco o negro intermedio no será visible.

Por último, pero no menos importante, reducir el número de controles secundarios siempre es un buen enfoque para resolver problemas lentos de pintura. Anule el evento OnPaint () de la UC y dibuje lo que ahora se muestra en un niño. Particular Label y PictureBox son muy derrochadores. Conveniente para apuntar y hacer clic, pero su alternativa ligera (dibujar una cadena o una imagen) toma solo una línea de código en su método OnPaint ().

Otros Links de interés (Información en Inglés):

¡No parpadee! Double Buffer!

Pintura sin parpadeo

Si alguien tiene una mejor sugerencia será bien recibida

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *