オブジェクトの管理
このセクションでは、マネージャーに含まれるオブジェクトを操作する方法について説明します。このセクションでは、次のトピックを扱います。
グラフィック・オブジェクトのジオメトリーを変更する
IlvManager クラスは、多数のグラフィック・オブジェクトを処理できるように設計されています。グラフィック操作を効率的に実行するために (たとえば、ビューの一部を再描画する、特定の位置にオブジェクトを配置するなど)、マネージャーは複雑な内部データ構造を使用します。この構造では、グラフィック・オブジェクトはそのジオメトリー、つまりバウンディング・ボックスに基づいて編成されます。このデータ構造を最新状態に保つために、マネージャーはグラフィック・オブジェクトのジオメトリーの変更を認識する必要があります。このため、このような変更は次の方法で実行する必要があります。
1. オブジェクトをマネージャー・リストから外す。
2. オブジェクトのジオメトリー特性を操作する。
3. オブジェクトをマネージャー・リストに戻す。
これを行うもっとも簡単な方法は、これらの要件を満たす専用の
IlvManager メンバー関数を使用することです。
IlvManager::applyToObject IlvManager::applyToObjects IlvManager::applyInside IlvManager::applyIntersects IlvManager::applyToTaggedObjects IlvManager::applyToSelections メモ: IlvGraphic::translate または IlvGraphic::scale メンバー関数を呼び出して、管理するオブジェクトのサイズを変更しないでください。マネージャーはオブジェクトの相対的な位置を追跡するために、洗練されたデータ構造と難解なインデックス・システムを使用します。これらのメカニズムに干渉することはできません。 |
IlvManager は移動、差分移動、形状変更などの単純なジオメトリー操作を行うため、
IlvManager::applyToObject を呼び出す必要のない以下のメンバー関数を提供しています。
IlvManager::translateObject IlvManager::moveObject IlvManager::reshapeObject 例:オブジェクトの差分移動
次のコードは、マネージャーから test という名前のオブジェクトへのポインターを取得します。このオブジェクトが存在する場合、10 ピクセル右へ、20 ピクセル下へ移動してから再描画されます (4 番目のパラメーターは IlTrue に設定)。
object = manager->getObject(“test”); if (object) manager->translateObject(object, 10, 20, IlTrue); |
関数を領域内のオブジェクトに適用する
一部または全部が特定の領域にあるオブジェクトに、ユーザー定義の関数を適用するには、次の IlvManager メンバー関数を使用します。
IlvManager::applyInside IlvManager::applyIntersects オブジェクトの選択
オブジェクトの選択状況を制御するには、以下の 2 つの
IlvManager メンバー関数を使用してください。
IlvManager::isSelected 例:
次のコードは、マネージャーから test という名前のオブジェクトへのポインターを取得します。オブジェクトが存在する場合は、それを選択し (2 番目のパラメーターを IlTrue に設定)、再描画します (3 番目のパラメーターを IlTrue に設定)。
object = manager->getObject(“test”); if (object) manager->setSelected(object, IlTrue, IlTrue); |
選択手順
選択タスクに関連する
IlvManager メンバー関数は次の通りです。
IlvManager::applyToSelections IlvManager::numberOfSelections IlvManager::deSelectAll IlvManager::getSelections IlvManager::deleteSelections IlvManager::getSelection IlvManager::setMakeSelection 例:選択ハンドル・オブジェクトのカスタマイズ
この例では、新規の選択ハンドル・オブジェクトを線オブジェクトに付加する方法を示します。
static IlvDrawSelection* MakeSelection(IlvManager* manager, IlvGraphic* graphic) { if (graphic->isSubtypeOf(“IlvLine”)) return new IlvLineHandle(manager->getDisplay(), graphic); else return new IlvDrawSelection(manager->getDisplay(), graphic); } |
以下のコードにより、選択オブジェクトを作成するために呼び出される関数が変更されます。選択されたオブジェクトが
IlvLine またはそれから派生したクラスのインスタンスである場合、マネージャーは選択を描画するために
IlvLineHandle オブジェクトを使用します。
manager->setMakeSelection(MakeSelection);
選択オブジェクトの管理
選択はマネージャーの基本プロセスであり、大部分のマネージャー関数は選択されたオブジェクトのリストに対して適用されます。マネージャー選択は、管理されるオブジェクトの一部を保持する特別なセットであると考えることができます。マネージャー内の選択したオブジェクトを表示するために、 Rogue Wave® Views は選択オブジェクトを作成し、マネージャーに保管します。これらのオブジェクトは通常のオブジェクトと異なり、内部的に管理されるため操作できません。
例:選択したオブジェクトの差分移動
以下の例は、選択したすべてのオブジェクトを 10 ピクセル右に、20 ピクセル下に差分移動するアクセラレーターを示します。このアクセラレーターはそれぞれのオブジェクトを差分移動するために IlvManager::applyToSelections メンバー関数を使用します。オブジェクトの再描画は、すべての適用関数と同様にこのメソッドの呼び出しの最後に一度行われます。これは、3 番目のパラメーターがデフォルト値の IlTrue に設定されているためです。
static void TranslateSelectedObjects (IlvGraphic* object, IlAny arg) { IlvManager* manager = (IlvManager*) arg; manager->translateObject(object, 10, 20, IlFalse); } static void TranslateAccelerator(IlvManager* manager, IlvView*, IlvEvent&, IlAny) { manager->applyToSelections(TranslateSelectedObjects, manager); } |
オブジェクト・プロパティーの管理
IlvManager クラスの複数のメンバー関数は、マネージャーに追加されるオブジェクトに割り当てられるプロパティーを表します (たとえば、
IlvManager::isSelectable、
IlvManager::setSelectable、
IlvManager::isResizeable など)。
IlvGraphic クラスのプロパティー関連メンバー関数により、それぞれのオブジェクトに特定のプロパティーを追加することもできます。これらのプロパティーはアプリケーションに依存し、マネージャーに影響はありません。
IlvManager は、オブジェクトにプロパティーがあるかどうかチェックするか、またはオブジェクトのプロパティーを変更するメンバー関数を提供します。
例:オブジェクトを非可動として設定する
これはマネージャー内のオブジェクトを非可動として設定する方法の例です。
object = manager->getObject(“test”); if (object) manager->setMoveable(object, IlFalse); |
オブジェクトの配置
IlvManager クラスは、グラフィック・オブジェクトのレイアウトの編成を支援するメンバー関数を提供します。
グループ化
IlvManager::group メンバー関数により、オブジェクトの配列から
IlvGraphicSet を作成し、
IlvGraphicSet からマネージャーへオブジェクトを移動できます。
IlvManager::ungroup メンバー関数により、この逆の操作もできます。
メモ: グラフィック・セットにグループ化されたグラフィック・オブジェクトは、マネージャーによって処理することはできなくなります。マネージャーはグラフィック・セットの参照のみを行います。 |
例:オブジェクトのグループ化
選択したオブジェクトをグループ化するアクセラレーターの例は次の通りです。
static void Group(IlvManager* manager, IlvView*, IlvEvent&, IlAny) { if (!manager->numberOfSelections()) return; IlvUInt n; IlvGraphic* const* objs = manager->getSelections(n); IlvGraphicSet* g = manager->group(n, (IlvGraphic* const*)objs); if (g) manager->setSelected((IlvGraphic*)g, IlTrue, IlTrue); } |
最初の行でオブジェクトの数を確認し、オブジェクトが選択されていない場合はオブジェクトを返しません。次に、選択したオブジェクトへのポインターが IlvManager::getSelections メンバー関数を使用して取得されます。次の行はグループを作成します。このアクセラレーターの最後で新しいオブジェクトが選択されます。
整列と複製
一部の
IlvManager メンバー関数は相互に自動整列するように定義されます。
IlvManager::align IlvManager::makeColumn IlvManager::makeRow IlvManager::sameWidth IlvManager::sameHeight 他のメンバー関数はオブジェクトを複製します。つまり、オブジェクトのコピーを作成し、それをマネージャーに挿入します。
IlvManager::duplicate メモ: これらの変更は、現在選択されているオブジェクトに常に適用されます。 |
例:選択したすべてのオブジェクトを同じ幅にする
このアクセラレーターにより、最初に選択されたオブジェクトの幅を選択されたすべてのオブジェクトに適用します。
static void SameWidth(IlvManager* manager, IlvView*, IlvEvent&, IlAny) { manager->sameWidth(IlTrue); } |
IlvManager::sameWidth に渡された値 IlTrue は、オブジェクトが自動的に再描画されることを示します。
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.