グラフィック・リソース > IlvPalette:リソースのグループを使用した描画
 
IlvPalette:リソースのグループを使用した描画
Rogue Waveィ Views では、描画リソースは IlvPalette クラスのオブジェクトに組み込まれています。描画の唯一の方法は、IlvPalette オブジェクトを使用することです。定義済みグラフィック・オブジェクトのほとんどは、IlvPalette
1 つ (場合によっては複数) 使用して、それ自体を描画します。
他の IlvResource サブクラスとは異なり、IlvPalette は、パブリック・コンストラクターを持っています。ただし、標準的には、IlvDisplay::getPalette メソッドから取得してパレットを作成します。パブリック・コンストラクターは、共有できないパレットを作成する場合にのみ使用します。
IlvPalette を共有することも、しないこともできます。名前付きのパレットは共有パレットのサブセットです。
詳細は、以下のセクションを参照してください。
*リソースのロックとロック解除
*クリッピング領域
*非共有パレットの作成
*共有パレットの作成
*パレットに名前を付ける
リソースのロックとロック解除
IlvPalette は、含まれるリソースすべてをロックし、不要になったときにロック解除します (パレットの破壊またはリソースの置換)。
クリッピング領域
以下のメソッドを使用して、パレットの描画に使用するクリッピング領域を変更します。
void setClip(const IlvRect* = 0) const;
void setClip(const IlvRegion*) const;
描画メソッドを使用する場合、描画はクリッピング領域にのみ表示され、他の領域は変更されません。
このため、IlvGraphic サブクラスの draw メソッドを作成する際に、描画をクリップする必要があります。draw メソッドでは、クリッピング領域がパラメーターとなります。描画に使用するパレットすべてにこのクリップを設定する必要があります。描画が完成したら、各パレットのクリップを前のクリップにリセットしてください。これはパレットが共有されているためです。これには IlvPushClip クラスを使用します。
以下に例を示します。
void MyGraphic::draw(IlvPort* dst,
const IlvTransformer* t,
const IlvRegion* clip) const
{
IlvPalette* myPalette = getPalette();
IlvPushClip (*myPalette, clip);
IlvPoint p1(10, 10), p2(50, 50);
// Do my drawings
dst->drawLine(myPalette, p1, p2);
}
非共有パレットの作成
IlvPalette のパブリック・コンストラクターを使用して、共有できないパレットを作成できます。
IlvPalette(IlvDisplay* display);
IlvPalette(IlvPalette* palette);
IlvPalette(IlvDisplay* display,
IlvColor* background,
IlvColor* foreground,
IlvFont* font,
IlvPattern* pattern);
最初のコンストラクターはデフォルトのパレットを作成し、2 つ目はその引数として与えられたパレットのコピーを作成し、3 つ目は引数として渡される特性を持つパレットを作成します。新しいパレットを作成したら、そのメンバー関数を使用して内部リソースを作成します (共有パレットでは作成しないでください)。
この技術は、パレットを共有したくない場合やパレット共有を完全に制御したい場合などの稀な場合に使用できます。パレットが不要になった場合は、削除する必要があります。この方法で作成したパレットは、共有リソース (色、フォントなど) を使用していることにご注意ください。
共有パレットの作成
IlvDisplay インスタンスは、共有パレットのリストを管理しています。新しいパレットが必要な場合、ディスプレイにそのサポートを要求する必要があります。このクラスは、getPalette メソッドを提供し、これを使用してパレットの内部リソースを指定できます。別のメンバー関数 getPalette(const char* name) については、名前付きのパレットに関する次のセクションで説明します。
要求に合ったパレットが既にリストにある場合は、そのパレットが返されます。共有パレットのリストに要求に合ったパレットがない場合は、新しいパレットが作成され、リストに追加され、返されます。メンバー関数 IlvDisplay::getPalette は、返されたパレットをロックしません。この関数のリソース・パラメーターのいくつかは NULL に設定できます。ディスプレイは対応するデフォルトのリソースを使用します。
共有パレットの使用は、非常に一般的であり、ほとんどのアプリケーションには十分です。ただし、これらのパレットが実際に共有されており、その 1 つを変更すると好ましくない二次作用が起こる可能性が高いことに注意してください。ほとんどの場合、パレットはグラフィック・オブジェクト (つまり、IlvGraphic のサブクラス) の描画方法を制御するものです。
パレット自体は変更せず、グラフィック・オブジェクトのメンバー関数を使用してグラフィック・プロパティーを変更してください。グラフィック・オブジェクトはディスプレイ用に別のパレットを取得し、アプリケーションの別の部分に使用する場合に備えて元のパレットを保持します。
以下のコードは、パレート使用法の正誤を示したものです。
// To set the foreground color of IlvGraphic* graphic
IlvColor* color = graphic->getDisplay()->getColor(“blue”);
 
// The following line will affect all objects sharing the palette
graphic->getPalette()->setForeground(color); // Wrong way
 
// The following line will give another palette to the graphic object
// and will not affect objects pointing to the previous palette
graphic->setForeground(color); // Right way
パレットに名前を付ける
他のほとんどのリソースと同様、パレットはその IlvResource::setName メンバー関数を使用して名前を付けることができます。この関数は既存の名前を上書きするため、パレットに名前を付ける前にパレットに既に名前が付いているかどうかを確認してください。
メンバー関数 IlvDisplay::getPalette(const char* name) を使用して、共有パレットを名前で検索できます。
パレットの名前は、グラフィック・オブジェクトが出力ストリームに書き込まれる際に保存されます。このデータが入力ストリームとして読み込まれる際に、ディスプレイは最初に同じ名前を持つ既存のパレットを検索します。何も見つからなければ、ディスプレイはパレットを通常の方法で読み込みます (つまり、詳細に合致する既存パレットを検索し、見つからなければ新しいパレットを作成して名前を付けます)。

Version 5.6
Copyright © 2012, Rogue Wave Software, Inc. All Rights Reserved.