ビュー・フック
マネージャー・ビュー・フックは、マネージャーで (またはマネージャーにより) 特定のアクションが実行された場合にアプリケーションに通知するメカニズムの一部です。これは、マネージャーの内容の監視、マネージャーがグラフィック・オブジェクトを再描画した際の追加描画の実行、またはマネージャー・ビューのトランスフォーマーが変更された場合のアクション実行など、さまざまな理由で使用できます。
メモ: 他の通知メカニズムについては、 オブザーバー を参照してください。 |
このセクションは、以下のように構成されています。
マネージャー・ビュー・フック
マネージャー・ビュー・フックは、
IlvManagerViewHook クラスのインスタンスです。アクティブにするには、マネージャー・ビューと関連付ける必要があります。それぞれのマネージャー・ビューごとに、ビュー・フックのリストを 1 つ処理します。マネージャー・ビューにビュー・フックを関連付けたり、マネージャー・ビューからビュー・フックを切り離すには、
IlvManager メンバー関数を使用します。
IlvManager::installViewHook IlvManager::removeViewHook IlvManagerViewHook クラスは、特定の定義済みの操作が発生したときに自動的に呼び出される多数の仮想メンバー関数を有しています。以下に、これらのメンバー関数とそれらが呼び出される状況を挙げます。
マネージャーがマネージャー・ビューを描く前に呼び出されます。このメンバー関数は多くの場合、マネージャーがグラフィック・オブジェクトを表示する前に追加の描画を行うためにアプリケーションにオーバーロードされます。
マネージャーがマネージャー・ビューを描いた後で呼び出されます。このメンバー関数は多くの場合、マネージャーが表示するグラフィック・オブジェクトの一番上で追加の描画を行うためにアプリケーションにオーバーロードされます。
マネージャーがエクスポーズ・イベントを受け取った後に呼び出されます。
マネージャー・ビューのインタラクターが変更されるときに呼び出されます。
マネージャー・ビューのトランスフォーマーが変更されるときに呼び出されます。
マネージャー・ビューがリサイズされるときに呼び出されます。
マネージャー・ビューがマネージャーから切り離されるときに呼び出されます。
マネージャーの内容が変更されたとき、つまりグラフィック・オブジェクトが追加または削除されたかジオメトリーが変更されたときに呼び出されます。
ビューでイベントが発生すると、このビューに付加されたすべてのフックの関連メンバー関数がマネージャーに呼び出されます。
例:マネージャーにあるオブジェクトの数を監視する
以下のコードは
IlvManagerViewHook サブクラスで、マネージャーに含まれるオブジェクトの数を
IlvTextField に表示します。
class DisplayObjectsHook : public IlvManagerViewHook { public: DisplayObjectsHook(IlvManager* manager, IlvView* view, IlvTextField* textfield) : IlvManagerViewHook(manager, view), _textfield(textfield) {} virtual void contentsChanged(); protected: IlvTextField* _textfield; }; void DisplayObjectsHook::contentsChanged() { IlvUInt count = getManager()->getCardinal(); _textfield->setValue((IlvInt)count, IlTrue); } |
例:変換なしでスケールの表示を維持する
この部分は、
IlvManagerViewHook のサブタイプ化の例を説明します。最初に、マップと、コンパス・カードとして使用される円形スケールがあります。次に、フックによって、マネージャーはコンパス・カードに影響を与えずにビューを移動し、ズームします。スケールを元のサイズと位置に戻すために、
afterDraw および
transformerChanged メンバー関数が再定義されます。
static void ILVCALLBACK
Quit(IlvView* view, IlAny)
{
delete view->getDisplay();
IlvExit(0);
}
char* labels[] = {“N”, “O”, “S”, “E”, ““};
class ExHook
: public IlvManagerViewHook
{
public:
ExHook(IlvManager* m, IlvView* v, const IlvRect* psize=0)
: IlvManagerViewHook(m, v)
{
_cirscale = new IlvCircularScale(m->getDisplay(),
IlvRect(30, 30, 100, 100),
“%.4f”,
0, 100, 90., 360.);
_cirscale->setLabels(5, (const char* const*)labels);
}
virtual void afterDraw(IlvPort*,
const IlvTransformer* = 0,
const IlvRegion* = 0,
const IlvRegion* = 0);
virtual void transformerChanged(const IlvTransformer*,
const IlvTransformer*);
protected:
IlvRect _size;
IlvCircularScale* _cirscale;
};
void ExHook::afterDraw(IlvPort* dst,
const IlvTransformer*,
const IlvRegion*,
const IlvRegion* clip)
{
if (getManager()->isInvalidating())
getManager()->reDrawViews();
_cirscale->draw(dst, 0, 0 /*clip*/);
if (dst->isABitmap())
_cirscale->draw(getView(), 0, 0);
}
void ExHook::transformerChanged(const IlvTransformer* current,
const IlvTransformer* old)
{
IlvRect bbox;
_cirscale->boundingBox(bbox);
if (old) old->inverse(bbox);
if (current) current->apply(bbox);
if (!getManager()->isInvalidating())
{
getManager()->initReDraws();
getManager()->invalidateRegion(getView(), bbox);
}
}
static void
SetDoubleBuffering(IlvManager* m,
IlvView* v,
IlvEvent&,
IlAny)
{
m->setDoubleBuffering(v, !m->isDoubleBuffering(v));
}
int
main(int argc, char* argv[])
{
IlvDisplay* display = new IlvDisplay(“Example”, ““, argc, argv);
if (!display || display->isBad())
{
IlvFatalError(“Can’t open display”);
IlvExit(-1);
}
IlvView* view = new IlvView(display, “ExMan”, “Manager”,
IlvRect(0, 0, 400, 400));
view->setDestroyCallback(Quit);
IlvManager* manager = new IlvManager(display);
manager->addView(view);
manager->addAccelerator(SetDoubleBuffering, IlvKeyUp, ‘b’);
// Description of a map
manager->read(“../hook.ilv”);
// Instantiation of the hook class
ExHook* pHook = new ExHook(manager, view);
// Connect the hook to the manager view
manager->installViewHook(pHook);
manager->setInteractor(new IlvSelectInteractor(manager, view));
IlvMainLoop();
}
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.