一般的なディスプレイ デバイス コンテキスト
ウィンドウのクライアント領域での描画には、 一般的なデバイス コンテキスト が使用されます。 システムは、ウィンドウ クラスがディスプレイ デバイス コンテキスト スタイルを明示的に指定していないウィンドウに対して、既定で共通のデバイス コンテキストを提供します。 一般的なデバイス コンテキストは、通常、デバイス コンテキスト属性を大幅に変更せずに描画できるウィンドウで使用されます。 一般的なデバイス コンテキストは、追加のメモリやシステム リソースを必要としないため便利ですが、アプリケーションで多くの属性を使用する前に設定する必要がある場合は不便な場合があります。
システムは、表示デバイス コンテキスト キャッシュからすべての一般的なデバイス コンテキストを取得します。 アプリケーションは、ウィンドウが作成された直後に共通のデバイス コンテキストを取得できます。 一般的なデバイス コンテキストはキャッシュから取得されるため、アプリケーションは描画後にできるだけ早くデバイス コンテキストを常に解放する必要があります。 一般的なデバイス コンテキストが解放された後は無効になり、アプリケーションで描画を試みてはなりません。 もう一度描画するには、アプリケーションが新しい共通デバイス コンテキストを取得し、ウィンドウに描画するたびに共通のデバイス コンテキストを引き続き取得して解放する必要があります。 アプリケーションが GetDC 関数を使用してデバイス コンテキスト ハンドルを取得する場合は、 ReleaseDC 関数を使用してハンドルを解放する必要があります。 同様に、 BeginPaint 関数ごとに、アプリケーションで対応する EndPaint 関数を使用する必要があります。
アプリケーションがデバイス コンテキストを取得すると、クライアント領域の左上隅に合わせて配信元が調整されます。 また、クリッピング領域を設定して、デバイス コンテキストへの出力がクライアント領域にクリップされるようにします。 それ以外の場合は、クライアント領域の外部に表示される出力はすべてクリップされます。 アプリケーションが BeginPaint を使用して共通のデバイス コンテキストを取得する場合、システムはクリッピング領域にも更新領域を含め、出力をさらに制限します。
アプリケーションが共通のデバイス コンテキストを解放すると、システムはデバイス コンテキストの属性の既定値を復元します。 属性値を変更するアプリケーションは、共通のデバイス コンテキストを取得するたびにこれを行う必要があります。 デバイス コンテキストを解放すると、アプリケーションが選択した描画オブジェクトが解放されるため、アプリケーションはデバイス コンテキストを解放する前にこれらのオブジェクトを解放する必要はありません。 いずれの場合も、アプリケーションでは、解放後に共通のデバイス コンテキストが既定以外の選択を保持していると想定しないでください。