web-dev-qa-db-ja.com

更新、更新、再描画の違いは何ですか?

これらの3つの方法のどれが私に最も適しているかわかりません。彼らはすべて私のために働いています。更新、更新、再描画の違いを知っている人はいますか?

41
Ivan Prodanov

オンラインドキュメントによると。

更新 -画面上のコントロールを再描画します。

Refreshメソッドを呼び出して、コントロールをすぐに再描画します。更新はRepaintメソッドを呼び出します。 RefreshメソッドとRepaintメソッドを同じように使用します。

Repaint -コントロールに画面上のイメージを強制的に再描画させます。

Repaintを呼び出して、コントロールに画像をすぐに再描画させます。 ControlStyleプロパティにcsOpaqueが含まれている場合、コントロールはそれ自体を直接ペイントします。それ以外の場合、RepaintメソッドはInvalidateメソッドを呼び出してからUpdateメソッドを呼び出し、コントロールの下にあるコントロールの可視部分も同様に再描画します。

更新 -保留中のペイントメッセージをすぐに処理します。

Updateを呼び出すと、おそらく時間のかかる処理が実行される前に、コントロールが強制的に再描画されます。 Updateを使用して、Windowsペイントメッセージの到着を待つことができないユーザーに即座にフィードバックを提供します。

更新はコントロールを無効にしませんが、すでに無効になっている領域を強制的に再描画します。代わりにRepaintを呼び出して、コントロールも無効にします。

39
stukelly

あなたの質問はすでに答えられていますが、良いパフォーマンスが必要でちらつきが少ない場合は、代わりにInvalidateを呼び出す必要があります。 Windowsでペイントプロセスを最適化できます。

無効 -コントロールを完全に再描画します。

コントロール全体を再描画する必要がある場合は、Invalidateを使用します。コントロール内の複数の領域で再描画が必要な場合、Invalidateを使用すると、ウィンドウ全体が1回のパスで再描画され、冗長な再描画によるちらつきが回避されます。コントロールが実際に再描画される前に、Invalidateを複数回呼び出すことによるパフォーマンスの低下はありません。

33
Lars Truijens

古い(CBuilder 6)VCLリファレンスごと:

Invalidate "Invalidateは、表面全体を再描画する必要があることをコントロールに通知します。Invalidateを呼び出すと、一連の部分的な再描画に起因するちらつきを防ぐことができます。塗り直し」。

実際の再描画は、コントロールが更新されるまで発生しません。すぐに再描画を強制するには、代わりにRepaintを呼び出します。

Repaint "TWinControl :: RepaintはInvalidateメソッドを呼び出し、次にUpdateメソッドを呼び出してコントロールを再描画します"(わずかな言い換え)。

(悲しいことに、古いリファレンスは、私が持っている新しいリファレンス(CBuilder 2007)よりも優れており、完全です。

3
jeff slesinger