英語で読む

次の方法で共有


非クライアント領域

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

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

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

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