2010-09-15 9 views
26

ho aggiunto questo al codice del costruttore di mia forma:WinForms doppio buffer

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

Ma mostra ancora brutti artefatti quando si carica i controlli, ogni volta che cambiano (la forma e le sue componenti cambiano (aggiornamento bisogno) spesso) .

Cosa devo fare in modo diverso?

risposta

53

Questo ha effetto solo sul modulo stesso, non sui controlli figlio. Se ne hai molti, allora il tempo necessario per dipingere a turno diventa evidente, lascia un buco rettangolare dove va il controllo che non si riempie finché il controllo figlio non lo fa girare.

Quello che ti serve per combattere questo è il doppio buffering dell'intero modulo e i controlli. Questa è un'opzione disponibile da quando Windows XP ha reso disponibile il flag di stile WS_EX_COMPOSITED. Incolla questo nella vostra forma per accenderlo:

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

Non accelerare il dipinto a tutti, ma la forma scatta sullo schermo dopo un ritardo. Eliminazione degli artefatti pittorici visibili. Fissare davvero il ritardo non richiede l'uso di controlli. Che cosa faresti utilizzando il metodo OnPaint per disegnare i 'controlli' e rendere l'evento OnMouseClick intelligente su cosa 'controllo' è stato cliccato dall'utente.

+0

WS_EX_COMPOSITED sta lavorando solo su temi classici sotto win7/vista, non su temi aerodinamici. Qualcuno conosce la soluzione in questo caso? – KevinBui

+4

@DKhanh - questo ha funzionato per me su Aero –

+0

Funziona come un incantesimo (non un riferimento agli incantesimi di Windows 8, ma spero che funzioni anche su Windows 8 e XP, se necessario). –