0

我正在基于搅拌机的 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`
}

我编写了两个类 KeyDriver 和 MouseDriver,它们应该处理 GHOST 事件并通知那些对事件感兴趣的人。现在真正的问题是从驱动程序类实现进一步事件分发的最佳实践是什么,我已经阅读了几篇文章和解决方案,事件系统如何工作,如http://accu.org/index.php/journals/464C++ 事件系统设计,但我不知道该选择哪个以及为什么一个比另一个更好。

我曾想过像 Java 中的 Swing 那样做。在哪里创建并注册了监听器类来监听组件事件,并且监听器类必须从某个类继承。

为什么这种方法比使用回调函数的仿函数更糟糕?您会选择哪种实现方式,为什么?

4

1 回答 1

3

我使用 Boost.Signals2(这是您已经引用过的 StackOverflow 问题的公认答案)。三四年前我第一次学习 Boost 库时就开始使用它,事实证明它简单、灵活、优雅且可靠;我没有理由寻找另一种解决方案。

自从我使用 Swing 以来已经有一段时间了,所以我无法真正深入评论。使用 Signals2,您仍然“创建”一个“监听器类”(通过定义信号类型;监听器是结果槽类型);connect()并且您通过该方法将侦听器“注册”到给定的信号实例。

使用 Signals2,每个信号都可以接受多个参数,如果需要,可以将结果返回给信号器。连接维护有很大的灵活性。

于 2013-03-21T22:10:40.657 回答