cegui的事件机制

本文介绍了CEGUI的事件处理机制,通过动态注册事件响应来实现灵活的事件处理流程。不同于传统的类继承方式,CEGUI允许将任何类的成员函数注册为事件响应函数,并通过SubscriberSlot对象保存这些函数的引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近的编码中接触到了cegui,于是顺便看了一下它的事件机制,可以动态注册事件响应。

在高层次上,每一个窗口都是由EventSet派生而来,每当希望增加对一个Event的响应时,调用如下接口就可以动态的把一个

类的普通成员函数注册到一个事件map(以事件名称作为关键字)中:

Event::Connection subscribeEvent(const String& name, Event::Subscriber subscriber);

当窗口的对应事件发生时,程序会去map中查找到Subscriber然后调用其中保存的对象的成员函数。

在这之前我一直以为C++中只能做到通过类的继承注册派生类的普通成员函数(类似MFC中的做法),但是cegui中任何类的成员函数都可以注册。

cegui中是通过这几个类实现这样一种灵活的机制的:

 

 

 SlotFunctorBase是一个普通的基类。

MemberFunctionSlot为一个包含有对象指针及成员函数指针的类模板。FreeFunctionSlot等则包含一个函数对象的类模板。它们两者皆从SlotFunctorBase派生而来。

SubscriberSlot是一个普通类,它保存一个SlotFunctorBase指针指向SlotFunctorBase的几个派生类模板的实例对象。

这样当调用subscribeEvent时,就会创建一个SubscriberSlot对象,指向某对象的成员函数,事件发生时查找map找到SubscriberSlot即可以通过它调用某对象的成员函数。

这其中容易出现的一个问题是,注册了某事件,但是对应的对象销毁了,于是map中保存的数据无效,当这个事件发生时通过map调用响应函数就会出现异常。

 总的来说,cegui通过还不错的方式(比MFC好太多了)实现了C++中的委托吧,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值