Saltar al contenido

Parpadeo en una aplicación de Windows Forms

Este tutorial ha sido probado por especialistas para garantizar la exactitud de nuestra esta división.

Solución:

Me lo imaginé. El truco consiste en eliminar el indicador WS_EX_COMPOSITED después de que se muestre el formulario. La explicación completa y el código en mi blog:

Cómo deshacerse del parpadeo en las aplicaciones de Windows Forms

Sé que esta pregunta es un poco antigua, pero más vale tarde que nunca. Usé su ejemplo original que vinculó para crear uno que lo activa al cambiar el tamaño, luego lo desactiva para dibujar todo lo demás perfectamente. Esperemos que ayude a otros a buscar una solución a este problema. Como sabe el OP, las propiedades de DoubleBuffering por sí solas no resuelven los problemas de parpadeo.

Aquí hay una solución para dejar de parpadear cuando un usuario cambia el tamaño de un formulario, pero sin estropear el dibujo de controles como DataGridView, NumericUpDown, etc. Siempre que el nombre de su formulario sea “Form1”:

int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;

public Form1()

    ToggleAntiFlicker(false);
    InitializeComponent();
    this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
    this.ResizeEnd += new EventHandler(Form1_ResizeEnd);


protected override CreateParams CreateParams

    get
    
        if (intOriginalExStyle == -1)
        
            intOriginalExStyle = base.CreateParams.ExStyle;
        
        CreateParams cp = base.CreateParams;

        if (bEnableAntiFlicker)
        = 0x02000000; //WS_EX_COMPOSITED
        
        else
        
            cp.ExStyle = intOriginalExStyle;
        

        return cp;
    
 

private void Form1_ResizeBegin(object sender, EventArgs e)

    ToggleAntiFlicker(true);


private void Form1_ResizeEnd(object sender, EventArgs e)

    ToggleAntiFlicker(false);


private void ToggleAntiFlicker(bool Enable)

    bEnableAntiFlicker = Enable;
    //hacky, but works
    this.MaximizeBox = true;

Pruebe el siguiente código. Esto debería ir en el formulario principal y en cualquier otro control de usuario personalizado que tenga.

        // Enable double duffering to stop flickering.
        this.SetStyle(ControlStyles.DoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
        this.SetStyle(ControlStyles.Opaque, false);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);

Comentarios y valoraciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *