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

更新 : 2007 年 11 月

単純なグラフィックをアニメーション化する場合、ちらつきやその他の望ましくない視覚効果が生じる可能性があります。この問題を抑制する 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 イベント ハンドラ内ではグラフィックス関連のメソッドを呼び出さないようにします。呼び出すと、フォームをサイズ変更したり、フォームが他のフォームによって隠されたりしている場合に、内容が再描画されなくなります。

参照

参照

CopyPixelOperation

Graphics.FillRectangle

Control.OnPaint

その他の技術情報

Windows フォームにおけるグラフィックスと描画

ペンを使用した直線と図形の描画