Platform SDK: DirectX

ウィンドウ モードでのパレット エントリの設定

[C++]

フルスクリーン排他モード アプリケーションとは異なり、ウィンドウ アプリケーションはほかのアプリケーションとデスクトップ パレットを共有する必要がある。このため、どのパレット エントリを安全に修正でき、どのようにそれらを修正するのかについて、いくつかの制限がある。DirectDrawPalette オブジェクトや GDI に作用する場合に使用する PALETTEENTRY 構造体には、システムが PALETTEENTRY 構造体をどのように判断すべきかについて記述した情報を伝達する peFlags メンバが含まれる。

peFlags メンバは、次に説明する 3 つのタイプのパレット エントリを記述する。

[Visual Basic]

フルスクリーン排他モード アプリケーションとは異なり、ウィンドウ アプリケーションは他のアプリケーションとデスクトップ パレットを共有する必要がある。このため、どのパレット エントリを安全に修正でき、どのようにそれらを修正するのかについて、いくつかの制限がある。DirectDrawPalette オブジェクトや GDI に作用する場合に使用する PALETTEENTRY 型には、システムが PALETTEENTRY 型をどのように判断すべきかについて記述した情報を伝達する flags メンバが含まれる。

flags メンバは、次に説明する 3 つのタイプのパレット エントリを記述する。

Windows スタティック エントリ

通常モードでは、Windows はシステム カラーとして 0 から 9、および 246 から 255 までのパレット エントリを確保しており、メニュー バー、メニュー テキスト、およびウィンドウの境界などを表示するためにこれらのシステム カラーを使用する。アプリケーションの外観を一定に維持し、他のアプリケーションの外観を損なうことのないように、プライマリ サーフェスに設定したパレットのこれらのエントリを保護する必要がある。開発者が、GetSystemPaletteEntries Win32® 関数を呼び出してシステム パレット エントリを取得し、同一のエントリをカスタム パレットに明示的に設定した後、それをプライマリ サーフェスに割り当てる場合がある。カスタム パレットでシステム パレット エントリを複製したばかりなら作用するが、ユーザーがデスクトップ カラー スキームを変更すると無効になる。

ユーザーがカラー スキームを変更するときに、パレットが損なわれないようにするには、カラー値を指定するのではなく、システム パレットへの参照を提供することで該当するエントリを保護する。このようにして、与えられたエントリに対してシステムがどの色を使用していても、パレットは常に適合し、更新する必要はない。peFlags メンバで使用する PC_EXPLICIT フラグにより、システム パレット エントリを直接参照することができる。このフラグを使用する場合、システムは構造体の他のメンバに色情報があることを仮定しない。PC_EXPLICIT を使用する場合、peRed メンバに望ましいシステム パレット インデックスを設定し、他の色をゼロにする。

[C++]

たとえば、パレットの適切なエントリが常にシステムのカラー スキームに適合するようにするには、以下のコードを使用する。

// 最初と最後の 10 エントリを // システム パレットに適合するように設定する。
PALETTEENTRY pe[256];
ZeroMemory(pe, sizeof(pe));
for(int i=0;i<10;i++){
    pe[i].peFlags  = pe[i+246].peFlags = PC_EXPLICIT;
    pe[i].peRed = i;
    pe[i+246].peRed = i+246;
} 

SetSystemPaletteUse Win32 関数を呼び出して、Windows が最初と最後のパレット エントリ (0 と 255) しか使用できないようにすることもできる。この場合、PALETTEENTRY 構造体の 0 と 255 のエントリだけを PC_EXPLICIT に設定する。

アニメーション エントリ

対応する PALETTEENTRY 構造体に PC_RESERVED フラグを使用することで、アニメーションするパレット エントリを指定できる。Windows では、他アプリケーションが論理パレット エントリを物理パレット エントリにマップさせない。このため、アプリケーションがパレットをアニメーションするときに、他のアプリケーションがその色を元に戻さないようにできる。

非アニメーション エントリ

対応する PALETTEENTRY 構造体に PC_NOCOLLAPSE フラグを使用することで、アニメーションしない通常のパレット エントリを指定できる。PC_NOCOLLAPSE フラグは、他の割り当て済みの物理パレット エントリをそのエントリで置き換えないよう Windows に伝える。

[Visual Basic]

SetSystemPaletteUse Win32 関数を呼び出して、Windows が最初と最後のパレット エントリ (0 と 255) しか使用できないようにすることもできる。この場合、PALETTEENTRY 型の 0 と 255 のエントリだけを PC_EXPLICIT に設定する。

アニメーション エントリ

対応する PALETTEENTRY 型に PC_RESERVED フラグを使用することで、アニメーションするパレット エントリを指定できる。Windows では、他アプリケーションが論理パレット エントリを物理パレット エントリにマップさせない。このため、アプリケーションがパレットをアニメーションするときに、他のアプリケーションがその色を元に戻さないようにできる。

非アニメーション エントリ

対応する PALETTEENTRY 型に PC_NOCOLLAPSE フラグを使用することで、アニメーションしない通常のパレット エントリを指定できる。PC_NOCOLLAPSE フラグは、他の割り当て済みの物理パレット エントリをそのエントリで置き換えないよう Windows に伝える。