論理パレット
論理パレットは、アプリケーションが作成し、特定のデバイス コンテキストに関連付けるカラー パレットです。 論理パレットを使用すると、アプリケーションは特定のニーズを満たす色を定義して使用できます。 アプリケーションは、個別のデバイス コンテキストに使用したり、1 つのデバイス コンテキストで切り替えたりして、任意の数の論理パレットを作成できます。 アプリケーションで作成できるパレットの最大数は、システムのリソースによって異なります。
アプリケーションは、 CreatePalette 関数を使用して論理パレットを作成します。 アプリケーションは LOGPALETTE 構造体に入力します。この構造体は、エントリの数と各エントリの色の値を指定し、その構造体を CreatePalette に渡します。 関数は、後続のすべての操作でアプリケーションがパレットを識別するために使用するパレット ハンドルを返します。 論理パレットで色を使用するには、 SelectPalette 関数を使用してパレットをデバイス コンテキストに選択し、 RealizePalette 関数を使用してパレットを実現します。 パレット内の色は、論理パレットが実現されるとすぐに使用できます。
アプリケーションでは、論理パレットのサイズを、必要な色を表すだけの十分なエントリに制限する必要があります。 アプリケーションでは、最大パレット サイズ (デバイスに依存する値) を超える論理パレットを作成できません。 アプリケーションは、 GetDeviceCaps 関数を使用して SIZEPALETTE 値を取得することで、最大サイズを取得できます。
アプリケーションは論理パレット内の特定のエントリに対して任意の色の値を指定できますが、特定のデバイスですべての色を生成できるわけではありません。 システムは、サポートされている色を検出する方法を提供しませんが、アプリケーションは、デバイスの色解像度を取得することで、これらの色の合計数を検出できます。 ピクセルあたりの色ビット数で指定された色の解像度は、 GetDeviceCaps 関数によって返される COLORRES 値と等しくなります。 色の解像度が 18 のデバイスには、262,144 色が含まれます。 アプリケーションがサポートされていない色を要求した場合、システムは適切な近似値を選択します。
論理パレットを作成すると、 アプリケーションは SetPaletteEntries 関数を使用してパレットの色を変更できます。 論理パレットが選択され、実現されている場合、パレットを変更しても、表示されている色にすぐには影響しません。 アプリケーションでは、 UnrealizeObject 関数と RealizePalette 関数を使用して色を更新する必要があります。 場合によっては、アプリケーションで論理パレットの選択解除、非実現、選択、および実現を行い、要求されたとおりに色が確実に更新されるようにする必要があります。 アプリケーションが複数のデバイス コンテキストに論理パレットを選択した場合、論理パレットに対する変更は、選択されているすべてのデバイス コンテキストに影響します。
アプリケーションは ResizePalette 関数を使用して、論理パレット内のエントリの数を変更できます。 アプリケーションでサイズが小さければ、残りのエントリは変更されません。 アプリケーションがサイズを拡張すると、新しいエントリごとに色が黒 (0、0、0) に設定され、フラグが 0 に設定されます。
アプリケーションは、 GetPaletteEntries 関数を使用して、指定された論理パレット内のエントリの色とフラグの値を取得できます。 アプリケーションは、 GetNearestPaletteIndex 関数を使用して、指定された色の値に最も近い特定の論理パレット内のエントリのインデックスを取得できます。
アプリケーションに論理パレットが不要になった場合は、 DeleteObject 関数を使用して削除できます。 アプリケーションでは、パレットを削除する前に、論理パレットがデバイス コンテキストで選択されなくなったことを確認する必要があります。