方法: 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 イベント ハンドラーでグラフィックス関連のメソッドを呼び出さないでください。フォームのサイズが変更されたり、別のフォームによって隠されたりした場合、描画されたコンテンツは再描画されないためです。
関連項目
- CopyPixelOperation
- Graphics.FillRectangle
- Control.OnPaint
- Windows フォームでのグラフィックスと描画
- ペンを使用して線や図形を描画する
.NET Desktop feedback