ウィンドウを再描画したい場合、InvalidateRectとRedrawWindowの間で呼び出す優先関数はありますか?
たとえば、これらの2つの呼び出しが等しいかどうか(winはHWNDになります)RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);
主な質問:いつどちらを使うべきですか?バックグラウンドで発生する違いはありますか? (異なるWM_messages/focus/order/prioritys ..)
ウィンドウを再描画する理由は、表示したい新しいイメージを送信するためです。つまり、ウィンドウのコンテンツが無効になります。
InvalidateRect
はウィンドウをすぐに再描画しません。ウィンドウの特定の矩形領域の将来の再描画を単に「スケジュール」します。 InvalidateRect
を使用すると、必要な数の領域をスケジュールして、内部バッファで累積にすることができます。蓄積されたすべてのスケジュールされた領域の実際の再描画は、後でウィンドウが他に何もすることがないときに行われます。 (もちろん、InvalidateRect
呼び出しを発行した時点でウィンドウがアイドル状態の場合、再描画はすぐに行われます)。
UpdateWindow
を呼び出すことにより、現在蓄積されているすべての無効化された領域の即時再描画を強制することもできます。ただし、急いでいない場合は、UpdateWindow
を明示的に呼び出す必要はありません。ウィンドウがアイドル状態になると、現在無効になっているすべての領域の再描画が自動的に実行されるためです。
一方、RedrawWindow
は、はるかに広く柔軟な機能セットを持つ関数です。無効化スケジューリングを実行するために使用できます(つまり、InvalidateRect
と同じこと)、または「スケジューリング」を行わずに、指定された領域の即時再描画を強制的に実行するために使用できます。後者の場合、RedrawWindow
を呼び出すことは、InvalidateRect
を呼び出してすぐにUpdateWindow
を呼び出すことと実質的に同等です。
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
を呼び出すことはよりクリーンに思えます。
リンクだけを与えるのは好きではありませんが、MSDNは必要なすべての情報を提供するので、ここですべてを再入力するのは時間の無駄です。
要するに、はい、違いがあります。問題は、なぜウィンドウを再描画するのですか?内容が無効になったためですか?その場合、InvalidateRect
を使用し、そうでない場合はRedrawWindow
を使用します。
RedrawWindowは、ウィンドウをすぐに再描画します。 InvalidateRectは、次のWM_Paintメッセージで再描画されるウィンドウのみをマークします。ただし、WM_Paintメッセージは他のメッセージよりも優先度が低いため、アプリが他のメッセージの処理で忙しい場合、再描画はすぐには行われません。