web-dev-qa-db-ja.com

Winformsダブルバッファリング

これをフォームのコンストラクターコードに追加しました。

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

ただし、コントロールをロードすると、コントロールが変更されるたびに(フォームとそのコンポーネントが頻繁に変更される(更新が必要になる))、醜いアーティファクトが表示されます。

別の方法で何をする必要がありますか?

30
Xenoprimate

これはフォーム自体にのみ影響し、子コントロールには影響しません。あなたがそれらをたくさん持っているなら、彼らが順番に自分自身を描くのに必要な時間が目立つようになります、それはコントロールが行く長方形の穴を残します、それは子コントロールがそれを回すまで埋められません。

これに対抗するために必要なのは、フォーム全体をダブルバッファリングすることですおよびコントロール。これは、Windows XPでWS_EX_COMPOSITEDスタイルフラグが使用可能になったため、使用可能なオプションです。これをフォームに貼り付けてオンにします。

protected override CreateParams CreateParams {
  get {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
    return cp;
  }
}

ペイントの速度はまったく上がりませんが、フォームは遅れて画面にスナップします。目に見えるペイントアーティファクトを排除します。遅延を実際に修正するには、コントロールを使用しない必要があります。これは、OnPaintメソッドを使用して「コントロール」を描画し、OnMouseClickイベントをユーザーが「コントロール」をクリックしたものについてスマートにすることで行います。

57
Hans Passant