2012-10-10 56 views
7

El doble almacenamiento en memoria intermedia no funciona con el cuadro combinado. ¿Hay algún otro método para evitar el parpadeo en los formularios de Windows?¿Evita el parpadeo en Windows Forms?

tengo un formulario de Windows con el número de paneles en él. Solo estoy mostrando un panel a la vez según mi selección de menú.

tengo un panel de iconos, un panel de encabezado y el cuadro combinado. en función del elemento seleccionado de ese cuadro combinado, gridview1 y 2 se están llenando. cuando estoy seleccionando rápidamente el elemento del cuadro combinado con la flecha hacia abajo del teclado, el panel de iconos y el panel del encabezado siempre se vuelven a pintar. Necesito mantener ambos sin ningún cambio. estos dos paneles producen algún efecto de parpadeo (es decir, están parpadeando o parpadeando) mientras estoy cambiando el índice seleccionado del cuadro combinado. ¿Hay alguna forma de evitar este destello? Intenté doble buffer habilitado en el constructor de formulario y el evento de carga de formulario. Por favor, ayuda ..............

InitializeComponent(); 
       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); 

he intentado este código en evento de formulario Constuctor y la carga de forma

+2

Bienvenido a SO (stackoverflow). Lo siento 4 los votos a favor por los críticos. 'Windows forma número de paneles' no parece relevante para' evitar el parpadeo en los formularios de Windows'. No elimine la pregunta. Intenta mejorarlo en su lugar? ¿Compartir (codificar) cómo está intentando duplicar el búfer? y edite el título como 'evitar parpadear en forma de ventanas'. – Sami

+0

Ok. He editado la pregunta – ManjuVijayan

+0

Todo es irrelevante. USE este control personalizado desde [http: // stackoverflow.com/preguntas/10362988/vista de árbol-parpadeo] [1] [1]: http://stackoverflow.com/questions/10362988/treeview-flickering – user1812146

Respuesta

23

Sin embargo, otra solución:

//TODO: Don't forget to include using System.Runtime.InteropServices. 

internal static class NativeWinAPI 
{ 
    internal static readonly int GWL_EXSTYLE = -20; 
    internal static readonly int WS_EX_COMPOSITED = 0x02000000; 

    [DllImport("user32")] 
    internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32")] 
    internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 
} 

Y su forma constructor debe verse de la siguiente manera:

public MyForm() 
{ 
    InitializeComponent(); 

    int style = NativeWinAPI.GetWindowLong(this.Handle, NativeWinAPI.GWL_EXSTYLE); 
    style |= NativeWinAPI.WS_EX_COMPOSITED; 
    NativeWinAPI.SetWindowLong(this.Handle, NativeWinAPI.GWL_EXSTYLE, style); 
} 

En el código anterior, es posible cambie this.Handle a algo así como MyFlickeringPanel.Handle

Puede leer un poco más al respecto aquí: Extended Window Styles y aquí: CreateWindowEx.

Con WS_EX_COMPOSITED conjunto, todos los descendientes de una ventana consiguen para la pintura de abajo hacia arriba usando doble búfer. El orden de pintura de abajo a arriba permite que una ventana descendiente tenga translucidez (alfa) y efectos de transparencia (clave de color), pero solo si la ventana descendiente también tiene el bit WS_EX_TRANSPARENT configurado. El doble almacenamiento temporal permite que la ventana y sus descendientes se pinten sin parpadeo.

+0

Gracias ... muchas gracias ... es me ayudó mucho ... es mi primera pregunta en SO. – ManjuVijayan

+0

No tengo mucha más reputación para votar la respuesta ... es por eso que no estoy votando ... Lo siento ............ – ManjuVijayan

+0

@Khil tuve este problema y esto funcionó muy bien. Mi aplicación parpadeaba mal, así que probé esto y luego no parpadeé. Entonces, lo que sí noté es que cada otra ventana en esta máquina también lo estaba haciendo. No me di cuenta de esto al principio porque me estaba concentrando en mi aplicación. Todavía no sé por qué todas las ventanas de esta máquina parpadean, pero sí sé que mi aplicación es la única que no :) – Jake

2

Solución # 1:
Uso ComboxBox.BeginUpdate() antes agregas elementos Esto evitará que el Control vuelva a pintar el ComboBox cada vez que se agrega un elemento a la lista. Después de agregar los elementos, puede usar ComboBox.EndUpdate() para volver a pintar.

Solución # 2

private void EnableDoubleBuffering() 
{ 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); 
} 
2
protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams handleParam = base.CreateParams; 
      handleParam.ExStyle |= 0x02000000; // WS_EX_COMPOSITED  
      return handleParam; 
     } 
    } 
Cuestiones relacionadas