32

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

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

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

他に何をする必要がありますか?

4

1 に答える 1

69

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

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

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

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

于 2010-09-15T14:33:43.690 に答える