|
|||||
|
|||||
|
||||||
WTLではGDIオブジェクトのパレットをCPaletteTというテンプレートクラスでカプセル化しています。
テンプレート引数はbool値で、trueの場合はデストラクタでDeleteObject()を呼び出し、
falseの場合は呼び出しません。atlgdi.hヘッダではtypedefによって次のように宣言されています。
WTLの CPaletteクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。
CPaletteT::CreatePalette()はカスタムパレットを作成します。
カスタムパレットは主に色の種類が少ない、微妙な階調が多用される画像のために使用されます。
CPaletteT::CreateHalftonePalette()はハーフトーンパレットを作成します。
ハーフトーンパレットは主に色の種類が多い画像のために使用されます。以下に示すのは、 CPaletteクラスを使用してクライアント領域に64階調の青いグラデーションを描画する例です。
グラデーションは微妙な階調で表現するので、カスタムパレットを使用します。
なお、パレットの影響を確認するために256色モードの画面で実行します。
次のスクリーンショットは、上がパレットを使用した場合で、下が使用していない場合の表示です。![]() ![]()
まず、先頭で CPaletteクラスのインスタンスであるm_paletteをメンバ変数として宣言します。
この変数は、CPaletteクラスのコンストラクタでNULLに初期化されています。次に、 WM_CREATEメッセージハンドラを見ます。
WM_CREATEメッセージハンドラでは始めに、パレットが必要かどうかをチェックしています。
チェックするには、ディスプレイが256色モードかどうかを判定します。
パレットが必要な場合はカスタムパレットを作成します。 次に、 WM_PAINTメッセージハンドラでは、
m_paletteがNULLではない場合(=パレットが必要な場合)、
作成したパレットオブジェクトをSelectPalette()で現在のパレットとして選択し、
RealizePalette()でリアライズします。
SelectPalette()は引数にHPALETTE型の変数を受け取りますが、
CPaletteTクラスはHPALETTE変換演算子を持っているのでそのまま渡すことができます。
SelectPalette()は以前のパレットハンドルを返すので、
これをhOldPaletteという変数に保存しておきます。次に、ブラシを使ってグラデーションを描画します。 明るい青から黒に近い青まで64階調で描画されます。 最後に、先ほど保存しておいた元のパレットハンドルに戻すため、 再度 SelectPalette()を呼び出して元のパレットハンドルを選択します。ところで、WTLはストックパレットもサポートしています。 以下に示すのは、ストックパレットによって描画する例です。
また、atlmisc.hヘッダに定義されている AtlGetStockPalette()というグローバル関数を使えば、
ストックパレットのハンドルを取得することができます。
|