2010-09-15 7 views
26

he añadido esto a código de constructor de mi formulario:Winforms doble búfer

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

Pero todavía muestra artefactos extraños cuando carga los controles, siempre que cambien (la forma y cambian sus componentes (necesidad de actualización) a menudo) .

¿Qué debo hacer de manera diferente?

Respuesta

53

Esto solo tiene un efecto en el formulario en sí, no en los controles secundarios. Si tienes muchos de ellos, entonces el tiempo que necesitan para tomar turnos para pintarse se vuelve notable, deja un agujero rectangular donde va el control que no se llena hasta que el control del niño lo hace girar.

Lo que necesitarás para combatir esto es doble-buffering el formulario completo y los controles. Esa es una opción disponible desde Windows XP que hizo que el indicador de estilo WS_EX_COMPOSITED esté disponible. Pega esto en su formulario para encenderlo:

protected override CreateParams CreateParams { 
    get { 
    CreateParams cp = base.CreateParams; 
    cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
    return cp; 
    } 
} 

No acelerar la pintura en absoluto, pero la forma encaja en la pantalla después de un retraso. Eliminando los artefactos de pintura visibles. Realmente arreglar el retraso requiere no usar controles. Lo cual harías usando el método OnPaint para dibujar los 'controles' y hacer que el evento OnMouseClick sea inteligente sobre en qué 'clic' el usuario hizo clic en 'control'.

+0

WS_EX_COMPOSITED solo está trabajando en el tema clásico en win7/vista, no en aero theme. ¿Alguien sabe solución en este caso? – KevinBui

+4

@DKhanh: esto funcionó para mí en Aero –

+0

Funciona como un amuleto (no una referencia a los amuletos de Windows 8, pero espero que también funcione en Windows 8, así como en XP, si es necesario). –