方法: ピクセルをコピーして Windows フォームのちらつきを低減する

単純なグラフィックをアニメーション化すると、ちらつきやその他の望ましくない視覚効果が発生することがあります。 この問題を抑制する 1 つの方法は、グラフィックに対して "bitblt" プロセスを使用することです。 bitblt とは、元の四角形のピクセルから転送先の四角形のピクセルへのカラー データの "ビットブロック転送" です。

Windows フォームでは、bitblt は Graphics クラスの CopyFromScreen メソッドを使用して実行できます。 このメソッドのパラメーターには、転送元と転送先 (ポイント)、コピーする領域のサイズ、および新しい図形の描画に使用されるグラフィックス オブジェクトを指定します。

次の例では、図形は Paint イベント ハンドラーでフォームに描画されます。 次に、CopyFromScreen メソッドが使用され、図形が複製されます。

注意

フォームの DoubleBuffered プロパティを true に設定すると、Paint イベントのグラフィックスベースのコードがダブルバッファリングされます。 以下のコードを使用するとき、これによって明らかなパフォーマンス向上はありませんが、さらに複雑なグラフィックス操作コードを使用する場合には注意が必要です。

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));  
}  

コードのコンパイル

上記のコードはフォームの Paint イベント ハンドラーで実行されるため、フォームが再描画されるときにグラフィックスは保持されます。 したがって、Load イベント ハンドラーでグラフィックス関連のメソッドを呼び出さないでください。フォームのサイズが変更されたり別のフォームによって見えなくなったりしていると、描画されたコンテンツが再描画されなくなるためです。

関連項目