Saltar al contenido

cómo dejar de parpadear C# winforms

Te damos la bienvenida a nuestra página, en este lugar vas a hallar la solucíon a lo que estabas buscando.

Solución:

Para una “solución más limpia” y para seguir usando el Panel base, simplemente puede usar Reflection para implementar el doble almacenamiento en búfer, agregando este código al formulario que contiene los paneles en los que desea dibujar.

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

Donde “DrawingPanel” es el nombre del panel en el que desea realizar el doble almacenamiento en búfer.

Sé que ha pasado bastante tiempo desde que se hizo la pregunta, pero esto podría ayudar a alguien en el futuro.

Finalmente solucionado el parpadeo. Como estaba dibujando en un panel en lugar del formulario, la siguiente línea de código no resolverá el parpadeo:

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

SetStyle debe ser del tipo ‘SuProyecto.SuProyecto’ (o derivado de él), por lo tanto, debe crear una clase como tal (para que pueda usar MyPanel, que se derivará de SPaint.SPaint y, por lo tanto, le permitirá usar el doble búfer directamente para el panel – en lugar de la forma):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SPaint; 

namespace YourProject

    public class MyPanel : System.Windows.Forms.Panel
    
        public MyPanel()
         
                System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, 
                true);
        
    

Una vez que haya hecho esto (aunque en realidad nunca debe editar el código del diseñador a menos que realmente sepa lo que está haciendo), tendrá que editar Form.Designer.cs. Dentro de este archivo encontrará un código que se ve así:

this.panelArea = new YourProject.MyPanel();

La línea anterior debe cambiarse a:

this.panelArea = new MyPanel(); 

Después de completar estos pasos, mi programa de pintura ya no parpadea.

Para cualquier otra persona que tenga el mismo problema, el problema finalmente está resuelto.

¡Disfrutar!

Copia y pega esto en tu proyecto

protected override CreateParams CreateParams

    get
    = 0x02000000;   // WS_EX_COMPOSITED       
        return handleParam;
    

Esto permite el almacenamiento en búfer doble para todos los controles desde el nivel de formulario hacia abajo; de lo contrario, el almacenamiento en búfer doble debe habilitarse individualmente para cada uno… es posible que desee ajustar el almacenamiento en búfer doble después de esto porque el almacenamiento en búfer doble cubierto puede tener efectos secundarios no deseados.

¡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 *