Procedura: copiare i pixel per ridurre lo sfarfallio in Windows Form
Quando si anima un oggetto grafico semplice, è possibile che si verifichino lo sfarfallio dell'immagine o altri effetti visivi indesiderati. Un modo per limitare tale problema consiste nell'utilizzare un processo "bitblt" sull'oggetto grafico. Per bitblt si intende il "trasferimento di blocchi di bit" dei dati relativi al colore da un rettangolo di pixel di origine a un rettangolo di pixel di destinazione.
In Windows Forms il processo bitblt viene ottenuto utilizzando il metodo CopyFromScreen della classe Graphics. Si specificano, nei parametri del metodo, l'origine e la destinazione (espressi in punti), le dimensioni dell'area da copiare e l'oggetto grafico utilizzato per disegnare la nuova forma.
Nell'esempio seguente viene disegnata una forma sul form nel gestore eventi Paint. Viene quindi utilizzato il metodo CopyFromScreen per duplicare la forma.
Nota
L'impostazione della proprietà DoubleBuffered del form su true comporta l'esecuzione del doppio buffer del codice basato su grafica contenuto nell'evento Paint. Pe quanto tale evenienza non equivalga a un miglioramento sensibile delle prestazioni quando si utilizza il codice riportato di seguito, è opportuno tenerne conto quando si utilizza codice più complesso per la modifica di oggetti grafici.
Esempio
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a circle with a bar on top.
e.Graphics.FillEllipse(Brushes.DarkBlue, New Rectangle _
(10, 10, 60, 60))
e.Graphics.FillRectangle(Brushes.Khaki, New Rectangle _
(20, 30, 60, 10))
' Copy the graphic to a new location.
e.Graphics.CopyFromScreen(New Point(10, 10), New Point _
(100, 100), New Size(70, 70))
End Sub
private void Form1_Paint(System.Object sender,
System.Windows.Forms.PaintEventArgs e)
{
e.Graphics.FillEllipse(Brushes.DarkBlue, new
Rectangle(10,10,60,60));
e.Graphics.FillRectangle(Brushes.Khaki, new
Rectangle(20,30,60,10));
e.Graphics.CopyFromScreen(new Point(10, 10), new Point(100, 100),
new Size(70, 70));
}
Compilazione del codice
Il codice precedente viene eseguito nel gestore eventi Paint del form affinché la grafica persista quando il form viene ridisegnato. Per tale ragione, non eseguire chiamate a metodi correlati a grafica nel gestore eventi Load perché il contenuto disegnato non verrà ridisegnato se il form viene ridimensionato o nascosto da un altro form.