システム パレット
システムは、パレットを使用するデバイスごとに システム パレットを保持します。 システム パレットには、デバイスで現在表示または描画できるすべての色の色の値が含まれています。 システム パレットの内容を表示する以外に、アプリケーションはシステム パレットに直接アクセスできません。 代わりに、システムはシステム パレットを完全に制御し、論理パレットを使用した場合にのみアクセスを許可します。
アプリケーションでは、 GetSystemPaletteEntries 関数を使用して、システム パレットの内容を表示できます。 この関数は、システム パレット内のエントリの合計数まで、1 つ以上のエントリの内容を取得します。 合計は常に 、GetDeviceCaps 関数によって SIZEPALETTE 値に対して返される数値と等しく、指定された論理パレットの最大サイズと同じです。
アプリケーションはシステム パレットの色を直接変更することはできませんが、論理パレットを実現するときに変更が発生する可能性があります。 パレットを実現するために、システムは要求された各色を調べ、完全一致を含むエントリをシステム パレットで見つけようとします。 一致する色が見つかると、論理パレット インデックスが対応するシステム パレット インデックスにマップされます。 システムが完全一致を見つけられない場合は、インデックスをマッピングする前に、要求された色を未使用のシステム パレット エントリにコピーします。 すべてのシステム パレット エントリが使用されている場合、システムは論理パレット インデックスを、要求された色に最も近い色のシステム パレット エントリにマップします。 このマッピングを設定した後は、アプリケーションでオーバーライドすることはできません。 たとえば、アプリケーションでシステム パレット インデックスを使用して色を指定することはできません。論理パレットインデックスのみが許可されます。
アプリケーションでは、論理パレットの作成時に PALETTEENTRY 構造体の peFlags メンバーを選択した値に設定することで、インデックスのマップ方法を変更できます。 たとえば、PC_NOCOLLAPSE フラグは、システム パレット エントリにその色が既に含まれているかどうかに関係なく、要求された色を未使用のシステム パレット エントリにすぐにコピーするようにシステムに指示します。 また、PC_EXPLICIT フラグは、論理パレット インデックスを明示的に指定されたシステム パレット インデックスにマップするようにシステムに指示します。 (アプリケーションは、 PALETTEENTRY 構造体の下位ワードのシステム パレット インデックスを提供します。
パレットは、SelectPalette 関数の bForceBackground パラメーターにそれぞれ TRUE または FALSE を指定することで、背景パレットまたは前景パレットとして実現できます。 システムには、一度に 1 つの前景パレットしか存在できません。 ウィンドウが現在アクティブなウィンドウまたは現在アクティブなウィンドウの子孫である場合は、前景パレットを実現できます。 それ以外の場合、 bForceBackground パラメーターの値に関係なく、パレットは背景パレットとして実現されます。 フォアグラウンド パレットの重要なプロパティは、認識されると、システム パレット内のすべてのエントリ (静的エントリを除く) を上書きできることです。 これは、システム パレットで静的でないすべてのエントリを、フォアグラウンド パレットを実現する前に未使用としてマークすることで実現されるため、使用されているすべてのエントリが削除されます。 バックグラウンド パレットを実現するために、システム パレットで前処理は行われません。 前景パレットは、使用可能なすべての非静的色を設定します。 背景パレットでは、開いたままの内容のみを設定でき、先着順で優先順位を付けることができます。 通常、アプリケーションでは、個々のパレットを実現する子ウィンドウにバックグラウンド パレットを使用します。 これにより、システム パレットに発生する変更の数を最小限に抑えることができます。
未使用のシステム パレット エントリは、予約されておらず、静的な色を含まないエントリです。 予約済みエントリは、PC_RESERVED値で明示的にマークされます。 これらのエントリは、アプリケーションがパレット アニメーションの論理パレットを認識したときに作成されます。 静的カラー エントリはシステムによって作成され、既定のパレットの色に対応します。 GetDeviceCaps 関数を使用して NUMRESERVED 値を取得できます。この値は、静的な色用に予約されているシステム パレット エントリの数を指定します。
システム パレットにはエントリの数が限られているため、特定のデバイスの論理パレットを選択して実現すると、同じデバイスの他の論理パレットに関連付けられている色に影響する可能性があります。 これらの色の変化は、ディスプレイで発生すると特に劇的です。 アプリケーションでは、使用する前にパレットをリセットすることで、現在選択されている論理パレットに適切な色が使用されていることを確認できます。 アプリケーションは UnrealizeObject 関数と RealizePalette 関数を呼び出してパレットをリセットします。 これらの関数を使用すると、システムは論理パレットの色をシステム パレット内の適切な色に再マップします。