Come eliminare lo sfarfallio nel controllo personalizzato di Windows.Forms durante lo scorrimento?

Voglio creare un controllo personalizzato in C #. Ma ogni volta che devo ridisegnare completamente il mio controllo, questo sfarfallio, anche se uso il doppio buffering (prima disegno a un’immagine e poi a quello blittante).

Come posso eliminare lo sfarfallio quando devo ridisegnare completamente?

Potresti provare a inserire quanto segue nel tuo costruttore dopo la chiamata InitiliseComponent.

SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); 

MODIFICARE:

Se stai dando questo, se puoi, rimuovi il tuo doppio codice di buffering e fai in modo che il controllo si disegna in risposta ai metodi virtuali appropriati che vengono chiamati.

L’ho estratto da un programma C # funzionante. Altri poster hanno errori di syntax e sono chiaramente copiati da C ++ anziché da C #

 SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); 

Potrebbe essere sufficiente per chiamare

 SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true); 

Lo sfarfallio si vede molto probabilmente perché Windows disegna prima lo sfondo del controllo (tramite WM_ERASEBKGND), quindi chiede al tuo controllo di eseguire qualsiasi disegno tu debba fare (tramite WM_PAINT). Disabilitando la pittura di sfondo e eseguendo tutte le verniciature nel proprio override OnPaint è ansible eliminare il problema nel 99% dei casi senza la necessità di utilizzare tutta la memoria necessaria per il doppio buffering.

Dici di aver provato il doppio buffering, ma poi dici di disegnare prima su un’immagine e poi su quella. Hai provato a impostare DoubleBuffered = true nel costruttore piuttosto che farlo da solo con un’immagine?