学习CEGUI亟待解决问题二:消息事件传递机制问题
公司的那个项目里面的事件传递看不过眼了哩。那多回调函数的重复代码。看CEGUI的事件机制MS还不错,抽点时间来学习学习。
Day1:
首先看一下消息传递的过程。就拿点击按钮的左键鼠标弹起消息来说吧。首先还是从wndProc开始,在WM_LBUTTONUP分支接收到鼠标弹起的消息,使用injectMouseButtonUp这个函数将该事件“注射”到系统中去。再遍历系统中所有存在的窗体,让每个窗体依次接收到消息,直到该消息被处理。代码dest_window->onMouseButtonUp(ma);用来处理每个窗体的鼠标左键弹起消息。然后onClicked(args)-> fireEvent(EventClicked, e, EventNamespace)->fireEvent_impl(name, args);-> (*ev)(args);->args.handled |= (*iter->second->d_subscriber)(args);->(*d_functor_impl)(args);->(d_object->*d_function)(args);->映射到具体的消息处理函数。
其上基本上是将堆栈的内容摆出来了,然后讲讲涉及到的类,包括EventSet(用来存放事件的容器),Event(事件),SubscriberSlot(用来订阅事件)。明天仔细研究下事件机制。
Day2:
今天来看下事件机制。拿列表框来说吧,