Share via


WM_PAINT メッセージ

通常、アプリケーションは、 WM_PAINT メッセージに応答してウィンドウに描画します。 ウィンドウへの変更によってクライアント領域の内容が変更されると、システムはこのメッセージをウィンドウ プロシージャに送信します。 システムは、アプリケーション・メッセージ待ち行列に他のメッセージがない場合にのみメッセージを送信します。

WM_PAINT メッセージを受信すると、アプリケーションは BeginPaint を呼び出してクライアント領域の表示デバイス コンテキストを取得し、GDI 関数の呼び出しでそれを使用して、クライアント領域を更新するために必要な描画操作を実行できます。 描画操作を完了すると、アプリケーションは EndPaint 関数を呼び出して、表示デバイス コンテキストを解放します。

BeginPaint が表示デバイス コンテキストを返す前に、システムは指定されたウィンドウのデバイス コンテキストを準備します。 最初に、デバイス コンテキストのクリッピング領域を、更新が必要なウィンドウの部分とユーザーに表示される部分の交差部分と同じになるように設定します。 変更されたウィンドウの部分のみが再描画されます。 この領域の外側に描画しようとするとクリップされ、画面には表示されません。

また、BeginPaint が戻前に、WM_NCPAINTメッセージとWM_ERASEBKGNDメッセージをウィンドウ プロシージャに送信することもできます。 これらのメッセージは、クライアント以外の領域とウィンドウの背景を描画するようにアプリケーションに指示します。 非クライアント領域は、クライアント領域の外側にあるウィンドウの部分です。 この領域には、タイトル バー、ウィンドウ メニュー ( システム メニューとも呼ばれます)、スクロール バーなどの機能が含まれます。 ほとんどのアプリケーションでは、既定のウィンドウ関数 DefWindowProc を使用してこの領域を描画し、 WM_NCPAINT メッセージをこの関数に渡します。 ウィンドウの背景は、他の描画操作を開始する前にウィンドウに塗りつぶされる色またはパターンです。 背景は、以前にウィンドウまたはウィンドウの下の画面にある画像をカバーします。 ウィンドウがクラスの背景ブラシを持つウィンドウ クラスに属している場合、 DefWindowProc 関数はウィンドウの背景を自動的に描画します。

BeginPaint は、更新するウィンドウの部分の寸法や、ウィンドウの背景が描画されているかどうかを示すフラグなどの情報を PAINTSTRUCT 構造体に塗りつぶします。 アプリケーションでは、この情報を使用して描画を最適化できます。 たとえば、 rcPaint メンバーによって指定された更新領域の寸法を使用して、図面を更新が必要なウィンドウの部分のみに制限できます。 アプリケーションに非常に単純な出力がある場合は、更新領域を無視してウィンドウ全体に描画し、不要な出力を破棄 (クリップ) するシステムに依存できます。 システムはクリッピング領域の外側に延びる描画をクリップするため、更新領域にある描画のみが表示されます。

BeginPaint は、ウィンドウの更新領域を NULL に設定 します。 これにより、リージョンがクリアされ、後続の WM_PAINT メッセージが生成されなくなります。 アプリケーションが WM_PAINT メッセージを処理しても BeginPaint を呼び出さない場合、または更新リージョンをクリアしない場合、アプリケーションは、リージョンが空でない限り 、WM_PAINT メッセージを受信し続けます。 いずれの場合も、アプリケーションは、 WM_PAINT メッセージから戻る前に更新リージョンをクリアする必要があります。

アプリケーションの描画が完了したら、 EndPaint を呼び出す必要があります。 ほとんどのウィンドウでは、 EndPaint によってディスプレイ デバイス コンテキストが解放され、他のウィンドウで使用できるようになります。 EndPaint は、 以前に BeginPaint によって非表示になっていたキャレットも表示します。 BeginPaint はキャレットを非表示にして、描画操作でキャレットが破損しないようにします。