次の方法で共有


プライベートディスプレイデバイスコンテキスト

プライベート デバイス コンテキストを使用すると、アプリケーションがウィンドウに描画する必要があるたびに、アプリケーションでディスプレイ デバイス コンテキストの取得と初期化を回避できます。 プライベート デバイス コンテキストは、描画用にデバイス コンテキストの属性の値を多く変更する必要があるウィンドウに便利です。 プライベート デバイス コンテキストでは、デバイス コンテキストの準備に必要な時間が短縮されるため、ウィンドウで描画を実行するために必要な時間が短縮されます。

アプリケーションは、ウィンドウ クラスでCS_OWNDC スタイルを指定して、ウィンドウのプライベート デバイス コンテキストを作成するようにシステムに指示します。 システムは、 クラスに属する新しいウィンドウを作成するたびに、一意のプライベート デバイス コンテキストを作成します。 最初は、プライベート デバイス コンテキストの属性の既定値は共通のデバイス コンテキストと同じですが、アプリケーションはこれらをいつでも変更できます。 システムは、ウィンドウの有効期間中、またはアプリケーションが追加の変更を行うまで、デバイス コンテキストに対する変更を保持します。

アプリケーションは、ウィンドウの作成後いつでも GetDC 関数を使用して、プライベート デバイス コンテキストへのハンドルを取得できます。 アプリケーションは、ハンドルを 1 回だけ取得する必要があります。 その後、ハンドルを何回でも保持して使用することができます。 プライベート デバイス コンテキストはディスプレイ デバイス コンテキスト キャッシュの一部ではないので、アプリケーションは ReleaseDC 関数を使用してデバイス コンテキストを解放する必要はありません。

システムは、ウィンドウの変更 (移動やサイズ変更など) を反映するようにデバイス コンテキストを自動的に調整します。 これにより、重複するウィンドウが常に適切にクリップされます。つまり、クリッピングを確保するためにアプリケーションでアクションは必要ありません。 ただし、更新リージョンを含むようにデバイス コンテキストは変更されません。 したがって、 WM_PAINT メッセージを処理する場合、アプリケーションは 、BeginPaint を呼び出すか、更新領域を取得して現在のクリッピング領域と交差させることで、更新領域を組み込む必要があります。 アプリケーションが BeginPaint を呼び出さない場合は、 ValidateRect 関数または ValidateRgn 関数を使用して、更新リージョンを明示的に検証する必要があります。 アプリケーションが更新リージョンを検証しない場合、ウィンドウは無限の一連の WM_PAINT メッセージを受け取ります。

ウィンドウにキャレットが表示されている場合、 BeginPaint はキャレットを非表示にするため、 BeginPaint を呼び出すアプリケーションでも EndPaint 関数を呼び出してキャレットを復元する必要があります。 EndPaint は、プライベート デバイス コンテキストに対して他の影響を及ぼしません。

プライベート デバイス コンテキストは便利に使用できますが、システム リソースの観点からはメモリを大量に消費するため、格納するには 800 バイト以上が必要です。 パフォーマンスに関する考慮事項がストレージ コストを上回る場合は、プライベート デバイス コンテキストをお勧めします。

WM_ERASEBKGND メッセージをアプリケーションに送信するときに、システムにはプライベート デバイス コンテキストが含まれます。 マッピング モードを含むプライベート デバイス コンテキストの現在の選択は、アプリケーションまたはシステムがこれらのメッセージを処理するときに有効です。 望ましくない影響を避けるために、システムは背景を消去するときに論理座標を使用します。たとえば、 GetClipBox 関数を使用して消去する領域の論理座標を取得し、これらの座標を FillRect 関数に渡します。 これらのメッセージを処理するアプリケーションでも、同様の手法を使用できます。

アプリケーションは GetDCEx 関数を使用して、プライベート デバイス コンテキストを持つウィンドウの共通デバイス コンテキストを強制的に返すことができます。 これは、プライベート デバイス コンテキストの属性の現在の値を変更せずに、ウィンドウにすばやくタッチアップを実行する場合に便利です。