Procedura: Copiare pixel per ridurre lo sfarfallio nelle Form di Windows
Quando si anima un elemento grafico semplice, gli utenti possono talvolta incontrare sfarfallio o altri effetti visivi indesiderati. Un modo per limitare questo problema consiste nell'usare un processo "bitblt" sulla grafica. Bitblt è il "trasferimento in blocchi di bit" dei dati di colore da un rettangolo di pixel di origine a un rettangolo di pixel di destinazione.
Con Windows Form, bitblt viene eseguito usando il metodo CopyFromScreen della classe Graphics. Nei parametri del metodo specificare l'origine e la destinazione (come 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 modulo nel suo gestore di eventi Paint. Viene quindi utilizzato il metodo CopyFromScreen per duplicare la forma.
Nota
Se si imposta la proprietà DoubleBuffered del modulo su true
, il codice basato sulla grafica nell'evento Paint verrà sottoposto a doppio buffer. Anche se questo non avrà alcun miglioramento delle prestazioni rilevabile quando si usa il codice seguente, è qualcosa da tenere presente quando si lavora con codice di manipolazione grafica più complesso.
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 della maschera in modo che la grafica sia mantenuta quando la maschera viene ridisegnata. Di conseguenza, non chiamare metodi correlati alla grafica nel gestore eventi Load, perché il contenuto disegnato non verrà ridisegnato se il modulo viene ridimensionato o nascosto da un altro modulo.
Vedere anche
.NET Desktop feedback