No es el tipo de parpadeo que puede resolver el doble búfer. Ni BeginUpdate o SuspendLayout. Tienes demasiados controles, la BackgroundImage puede hacer que sea un montón peor.
Comienza cuando UserControl se pinta a sí mismo. Dibuja la imagen de fondo, dejando huecos donde van las ventanas de control secundario. Luego, cada control secundario recibe un mensaje para pintarse a sí mismo, llenarán el agujero con el contenido de su ventana. Cuando tienes muchos controles, esos agujeros son visibles para el usuario por un tiempo. Normalmente son de color blanco, lo que contrasta mal con la imagen de fondo cuando está oscuro. O pueden ser negros si el formulario tiene su propiedad Opacity o TransparencyKey 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 representa Windows. Corregido por WPF por cierto, no usa ventanas para controles secundarios. Lo que querría es almacenar en búfer doble todo el formulario, incluidos los controles secundarios. Eso es posible, verifique mi código en este hilo para ver la solución. Sin embargo, tiene efectos secundarios y en realidad no aumenta la velocidad de pintura. El código es simple, pegue esto en su formulario (no en 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 pintura, hasta el punto de que el parpadeo ya no se nota. Empiece por abordar la imagen de fondo. Pueden ser muy costosos cuando la imagen de origen es grande y necesita reducirse para ajustarse al control. Cambie la propiedad BackgroundImageLayout a "Tile". Si eso le da una aceleración notable, vuelva a su programa de pintura y cambie el tamaño de la imagen para que coincida 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 de la imagen con el tamaño adecuado para que no tenga que cambiar de tamaño cada vez que el control vuelva a pintar. Utilice el formato de píxeles Format32bppPArgb para esa copia, se procesa unas 10 veces más rápido que cualquier otro formato de píxeles.
Lo siguiente que puedes hacer es evitar que los agujeros sean tan notorios y contrasten mal con la imagen. Puede desactivar la bandera de estilo WS_CLIPCHILDREN para UC, la bandera que evita que UC pinte 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 sobre la imagen de fondo. Es posible que aún los vea pintándose uno por uno, pero el feo agujero intermedio blanco o negro no será visible.
Por último, pero no menos importante, la reducción del número de controles secundarios es siempre un buen enfoque para resolver problemas de pintura lenta. Anule el evento OnPaint () de la UC y dibuje lo que ahora se muestra en un niño. Particular Label y PictureBox son un desperdicio. Conveniente para apuntar y hacer clic, pero su alternativa liviana (dibujar una cadena o una imagen) toma solo una línea de código en su método OnPaint ().
UpdateStyles
después de configurar estos? Está mal documentado, pero a veces puede ser necesario.