web-dev-qa-db-ja.com

InvalidateRectとRedrawWindowの違い

ウィンドウを再描画したい場合、InvalidateRectとRedrawWindowの間で呼び出す優先関数はありますか?

たとえば、これらの2つの呼び出しが等しいかどうか(winはHWNDになります)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

主な質問:いつどちらを使うべきですか?バックグラウンドで発生する違いはありますか? (異なるWM_messages/focus/order/prioritys ..)

ウィンドウを再描画する理由は、表示したい新しいイメージを送信するためです。つまり、ウィンドウのコンテンツが無効になります。

39
Default

InvalidateRectはウィンドウをすぐに再描画しません。ウィンドウの特定の矩形領域の将来の再描画を単に「スケジュール」します。 InvalidateRectを使用すると、必要な数の領域をスケジュールして、内部バッファで累積にすることができます。蓄積されたすべてのスケジュールされた領域の実際の再描画は、後でウィンドウが他に何もすることがないときに行われます。 (もちろん、InvalidateRect呼び出しを発行した時点でウィンドウがアイドル状態の場合、再描画はすぐに行われます)。

UpdateWindowを呼び出すことにより、現在蓄積されているすべての無効化された領域の即時再描画を強制することもできます。ただし、急いでいない場合は、UpdateWindowを明示的に呼び出す必要はありません。ウィンドウがアイドル状態になると、現在無効になっているすべての領域の再描画が自動的に実行されるためです。

一方、RedrawWindowは、はるかに広く柔軟な機能セットを持つ関数です。無効化スケジューリングを実行するために使用できます(つまり、InvalidateRectと同じこと)、または「スケジューリング」を行わずに、指定された領域の即時再描画を強制的に実行するために使用できます。後者の場合、RedrawWindowを呼び出すことは、InvalidateRectを呼び出してすぐにUpdateWindowを呼び出すことと実質的に同等です。

54
AnT

RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);InvalidateRect(win, NULL, NULL);は同等です。どちらの関数もウィンドウを無効にします。 _WM_Paint_は、どちらの場合も通常時に発生します(アプリケーションキューに他のメッセージはありません)。

ペイントをすぐに実行する場合は、RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)またはInvalidateRectに続いてUpdateWindowを呼び出すと、それが実行されます。

RedrawWindowは、RDW_ *ビットを使用してオプションを追加するだけです。必要なのが即時ペイントなしでウィンドウを無効化することだけであれば、InvalidateRectを呼び出すことはよりクリーンに思えます。

19
Mike T

リンクだけを与えるのは好きではありませんが、MSDNは必要なすべての情報を提供するので、ここですべてを再入力するのは時間の無駄です。

RedrawWindow

InvalidateRect

要するに、はい、違いがあります。問題は、なぜウィンドウを再描画するのですか?内容が無効になったためですか?その場合、InvalidateRectを使用し、そうでない場合はRedrawWindowを使用します。

1
Peter Alexander

RedrawWindowは、ウィンドウをすぐに再描画します。 InvalidateRectは、次のWM_Paintメッセージで再描画されるウィンドウのみをマークします。ただし、WM_Paintメッセージは他のメッセージよりも優先度が低いため、アプリが他のメッセージの処理で忙しい場合、再描画はすぐには行われません。

1
Stefan