Winforms Double Buffering

Ho aggiunto questo al codice costruttore del mio modulo:

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

Ma mostra ancora brutti artefatti quando carica i controlli, ogni volta che cambiano (il modulo ei suoi componenti cambiano (devono essere aggiornati) spesso).

Cosa devo fare in modo diverso?

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

Quello di cui hai bisogno per combattere questo è il doppio buffering dell’intero modulo e dei controlli. Questa è un’opzione disponibile da quando Windows XP ha reso disponibile il flag di stile WS_EX_COMPOSITED. Incolla questo nel tuo modulo per accenderlo:

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

Non accelera affatto il dipinto, ma il modulo 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.