50

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

たとえば、次の 2 つの呼び出しは等しいですか: (win は HWND になります)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

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

ウィンドウを再描画したいのは、表示したい新しい画像をウィンドウに送信したためです。つまり、ウィンドウの内容が無効になっています。

4

4 に答える 4

60

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

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

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

于 2010-02-24T17:24:07.553 に答える
21

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

ペイントをすぐに実行したい場合は、RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)またはInvalidateRectの後に anUpdateWindowを呼び出すと実行されます。

RedrawWindowRDW_* ビットでより多くのオプションを提供するだけです。すぐにペイントせずにウィンドウを無効にすることだけが必要な場合は、呼び出しInvalidateRectがよりクリーンに見えます。

于 2012-11-27T18:58:12.940 に答える
1

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

于 2010-02-24T17:14:46.837 に答える
1

私は単にリンクを提供するのは好きではありませんが、MSDN には必要なすべての情報が記載されているため、ここですべてを再入力するのは時間の無駄です。

再描画ウィンドウ

InvalidateRect

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

于 2010-02-24T12:51:01.617 に答える