No es el tipo de parpadeo que puede resolver el doble buffer. Ni BeginUpdate o SuspendLayout. Tienes demasiados controles, la imagen de fondo puede empeorar un lote.
Se inicia cuando el UserControl se pinta a sí mismo. Dibuja la imagen de fondo, dejando agujeros donde van las ventanas de control infantil. Cada control secundario recibe un mensaje para pintarse a sí mismo, llenarán el agujero con su contenido de ventana. Cuando tienes muchos controles, esos agujeros son visibles para el usuario por un tiempo. Normalmente son blancos, que contrastan mal con la imagen de fondo cuando está oscuro. O pueden ser negras si el formulario tiene su propiedad Opacidad o Transparencia clave establecida, lo que contrasta mal con casi cualquier cosa.
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, verifique mi código en this thread 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 forma (no el control de 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 no se nota más. 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 turn off 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 del 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, 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 desperdicio. 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().
¿Dónde están estas declaraciones? Idealmente, póngalos en el constructor. ¿Llamaste a 'UpdateStyles' después de configurar esto? Está mal documentado, pero a veces puede ser necesario. – Thomas