Share via


非クライアント領域

システムは、タイトル バー、メニュー バー、ウィンドウ フレームなど、ウィンドウの非クライアント領域の一部を更新する必要がある場合に、ウィンドウにWM_NCPAINT メッセージを送信します。 システムは、クライアント領域の一部を更新するウィンドウを指示する他のメッセージを送信することもできます。たとえば、ウィンドウがアクティブまたは非アクティブになると、 WM_NCACTIVATE メッセージが送信され、タイトル バーが更新されます。 一般に、標準ウィンドウに対してこれらのメッセージを処理することはお勧めしません。これは、アプリケーションがウィンドウの非クライアント領域に必要なすべての部分を描画できる必要があるためです。 このため、ほとんどのアプリケーションでは、既定の処理のためにこれらのメッセージを DefWindowProc に渡します。

ウィンドウ用にカスタムの非クライアント領域を作成するアプリケーションでは、これらのメッセージを処理する必要があります。 その場合、アプリケーションはウィンドウデバイスコンテキストを使用してウィンドウで描画を実行する必要があります。 ウィンドウ デバイス コンテキストを使用すると、アプリケーションは、クライアント以外の領域を含め、ウィンドウのすべての部分に描画できます。 アプリケーションは 、GetWindowDC 関数または GetDCEx 関数を使用してウィンドウ デバイス コンテキストを取得します。描画が完了したら、 ReleaseDC 関数を使用してウィンドウ デバイス コンテキストを解放する必要があります。

システムは、非クライアント領域の更新領域を保持します。 アプリケーションが WM_NCPAINT メッセージを受信すると、 wParam パラメーターには、更新リージョンのディメンションを定義するリージョンへのハンドルが含まれます。 アプリケーションでは、 ハンドルを使用して、更新領域とウィンドウ デバイス コンテキストのクリッピング領域を組み合わせることができます。 アプリケーションで GetDCEx を使用し、リージョン ハンドルと DCX_INTERSECTRGN フラグの両方を指定しない限り、ウィンドウ デバイス コンテキストを取得するときに、システムは更新リージョンを自動的に結合しません。 アプリケーションが更新領域を組み合わせない場合は、ウィンドウの外側に拡張される描画操作のみがクリップされます。 アプリケーションは、リージョンを使用するかどうかに関係なく、更新リージョンをクリアする責任を負いません。

アプリケーションが WM_NCACTIVATE メッセージを処理する場合は、処理後 に TRUE を 返して、アクティブ ウィンドウの変更を完了するようにシステムに指示する必要があります。 アプリケーションが WM_NCACTIVATE メッセージを受信したときにウィンドウが最小化されている場合は、メッセージを DefWindowProc に渡す必要があります。 このような場合、既定の関数はアイコンのラベルを再描画します。