2

または、別の方法で質問すると、OnEraseBkgnd()はどのように機能しますか?

カスタムコントロールを作成していますが、この問題が発生しました。

いつものように、子は長方形です。OnEraseBkgnd()を無効にする必要があり、OnPaint()のみを使用します。
私が必要としているのは、子供の後ろの領域をちらつきなく効率的にクリアすることです。バックバッファ

を使用するような手法はオプションではありません。

編集:OnEraseBkgnd()の内部にあるアルゴリズムに非常に興味があります。ただし、役立つ回答も受け付けます。

4

1 に答える 1

3

WM_ERASEBKGND通常、Windowsでは、ちらつきを減らす最も簡単な(ただし最も効果的ではない)方法は、通知処理をオフにすることです。これは、通知ハンドラーで背景を消去してからWM_PAINTハンドラーでウィンドウをペイントすると、2つの間に短い遅延があるためです。この遅延はちらつきとして表示されます。

代わりに、ハンドラーですべての消去と描画を行うと、WM_PAINTちらつきが大幅に少なくなる傾向があります。これは、2つの間の遅延が減少するためです。2つのアクションの間にまだわずかな遅延があるため、特にサイズ変更時に、まだ多少のちらつきが見られます。また、モニターの垂直ブランキング割り込みが次に発生する前に、すべての図面に入ることができるとは限りません。ダブルバッファリングを使用できない場合は、これがおそらく使用できる最も効果的な方法です。

クライアント領域の無効化に関する通常の推奨事項のほとんどに従うことで、描画パフォーマンスを向上させることができます。本当に必要な場合を除いて、ウィンドウ全体を無効にしないでください。変更された領域のみを無効にするようにしてください。また、BeginDeferWindowPos子ウィンドウのコレクションの位置を同時に更新する場合は、この関数を使用する必要があります。

于 2009-05-24T08:33:23.657 に答える