次の方法で共有


同期描画と非同期描画

WM_PAINT メッセージの処理中に実行されるほとんどの描画は非同期です。つまり、ウィンドウの一部が無効になり、WM_PAINTが送信されるまでの間に遅延があります。 遅延の間、アプリケーションは通常、キューからメッセージを取得し、他のタスクを実行します。 遅延の理由は、通常、システムはウィンドウ内の描画を優先度の低い操作として扱い、ウィンドウの位置またはサイズに影響を与える可能性のあるユーザー入力メッセージやメッセージが WM_PAINTする前に処理されるように動作します。

場合によっては、アプリケーションが同期的に描画する必要があります。つまり、ウィンドウの一部を無効にした直後にウィンドウで描画します。 一般的なアプリケーションでは、ウィンドウを作成した直後にメイン ウィンドウが描画され、アプリケーションが正常に開始されたことをユーザーに通知します。 このようなウィンドウはユーザー入力のフォーカスとして機能するため、システムはボタンなどの一部のコントロール ウィンドウを同期的に描画します。 単純な描画ルーチンを持つウィンドウは同期的に描画できますが、このような描画はすべて迅速に行う必要があり、ユーザー入力に応答するアプリケーションの機能に干渉しないようにする必要があります。

UpdateWindow 関数と RedrawWindow 関数を使用すると、同期描画を行えます。 UpdateWindow は、更新リージョンが空でない場合、 WM_PAINT メッセージをウィンドウに直接送信します。 RedrawWindowWM_PAINT メッセージも送信しますが、クライアント以外の領域とウィンドウの背景を描画するかどうか、更新領域が空かどうかに関係なくメッセージを送信するかどうかなど、ウィンドウの描画方法をより詳細に制御できます。 これらの関数 は、アプリケーション メッセージ キュー内の他のメッセージの数に関係なく、WM_PAINT メッセージをウィンドウに直接送信します。

ウィンドウの描画時に保留中のメッセージがブロックされるのを防ぐために、時間のかかる描画操作を必要とするウィンドウは非同期的に描画する必要があります。 また、ウィンドウの小さな部分を頻繁に無効にするアプリケーションでは、一連の同期WM_PAINT メッセージではなく、これらの無効な部分を 1 つの非同期 WM_PAINT メッセージに統合できるようにする必要があります。