ブレンダーの GHOST システムに基づいてシンプルな GUI システムを作成していますが、この質問ではそれほど重要ではないと思います。GHOST自体はシンプルなイベントシステムです。
私のイベント システムは柔軟である必要があり、MVC パターンの何らかの実装、スマートなメモリ割り当て解除が可能であり、クロスプラットフォームで動作し、c++0x で記述されている必要があります
次の例は、イベントを処理する GHOST から継承されたメソッドを示しています。
bool Application::processEvent(GHOST_IEvent *event)
{
GHOST_IWindow *window = event->getWindow();
bool handled = true;
switch (event->getType()) {
case GHOST_kEventWheel:
{
mouseDriver->handleWheel((GHOST_TEventWheelData *) event->getData());
}
break;
case GHOST_kEventButtonDown:
{
mouseDriver->handleButtonDown((GHOST_TEventButtonData *) event->getData());
}
break;
case GHOST_kEventButtonUp:
{
mouseDriver->handleButtonUp((GHOST_TEventButtonData *) event->getData());
}
break;
case GHOST_kEventCursorMove:
{
mouseDriver->handleCursorMove((GHOST_TEventCursorData *) event->getData());
}
break;
case GHOST_kEventKeyUp:
{
keyDriver->handleKeyUp((GHOST_TEventKeyData *) event->getData());
}
break;
case GHOST_kEventKeyDown:
{
keyDriver->handleKeyDown((GHOST_TEventKeyData *) event->getData());
}
break;
}
return true;//currently not used while experimenting`
}
GHOST イベントを処理し、イベントに関心のある人に通知する KeyDriver と MouseDriver の 2 つのクラスを作成しました。ここで本当の問題は、ドライバー クラスからさらにイベント分散を実装するためのベスト プラクティスは何かということです。私は、イベント システムがhttp://accu.org/index.php/journals/464またはC++ イベント システムのように機能する方法に関するいくつかの記事とソリューションを読みました。デザインですが、どちらを選択すればよいのか、なぜ一方が他方より優れているのかわかりません。
私はJavaのSwingのようにそれをやろうと考えました。コンポーネントイベントをリッスンするためにリスナークラスが作成および登録され、リスナークラスはいくつかのクラスから継承する必要があります。
このメソッドは、コールバック関数が使用されるファンクターよりも悪いのはなぜですか? どの実装を選択しますか?またその理由は?