Procedura: copiare i pixel per ridurre lo sfarfallio in Windows Form

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" nell'elemento grafico. Bitblt è il "trasferimento in blocchi di bit" dei dati di colore da un rettangolo di origine di pixel a un rettangolo di destinazione di pixel.

Con Windows Form, bitblt viene eseguito usando il CopyFromScreen metodo della Graphics classe . 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 form nel relativo Paint gestore eventi. CopyFromScreen Il metodo viene quindi utilizzato per duplicare la forma.

Nota

Se si imposta la proprietà del DoubleBuffered 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 del Paint modulo in modo che la grafica venga mantenuta quando il modulo viene ridisegnato. Di conseguenza, non chiamare metodi correlati alla grafica nel Load gestore eventi, perché il contenuto disegnato non verrà ridisegnato se il modulo viene ridimensionato o oscurato da un altro modulo.

Vedi anche