(06-10-30)
学习了irrlicht 引擎的 UI 部分的设计。就这个引擎来说,个人觉得 UI部分设计上虽然有些问题,但是效果还是不错的。于是写了 Panel 类。开始他只是个控件容器,后来添加了拖拽功能,目的很明显,我要通过他来实现窗口。
所以,以前在事件上的处理部分需要改动。当几个 Panel重叠的时候,会出现输入事件处理上的一些问题,比如同时多个控件感应到输入等。于是当某个控件接收并处理了输入后应该返回一个信息。那么我就这样该动了事件处理接口:
原来:
virtual void processEvent (Event *e) = 0;
现在:
virtual bool processEvent (Event *e) = 0;
当一个控件处理了输入消息,并需要系统丢弃这个消息的时候 (因为他已经处理了),返回true,否则返回false。
另外,对于窗口的设计,需要窗口管理他自己的子控件的输入事件的响应,于是不能让每个子控件自己直接与输入系统通信,输入系统的信息由容纳他的容器通知他。这样可以将消除与输入系统的绑定,很好。
(06-10-31)
在客户端事件的处理上,也就是使用UI控件的用户处理来自UI控件的事件时,可能需要通过事件的具体实例来转换成对应的事件,以便处理。
比如有个APP类:
class App : public CanListenEvent
{
bool processEvent (Event *e)
{
if (e->getRuntimeClassID()== ???:ClassID) //辨别事件
{
// 处理对应事件
}
}
};
这就要求不同的UI控件发出不同的事件,从而能彼此分离。所以设计的时候要注意。按照逻辑来说,不同的控件本来应该产生不同的事件,这是他们的本质。即便可以因为重用以前的一些事件,也可能会给将来的扩展带来麻烦。
(06-11-1)
鉴于很多控件有被拖拽的能力, 我将这种能力独立出来,形成类 IsDragable,来简化鼠标拖拽事件的处理。这不仅使得代码清晰,而且更具重用性。
将鼠标和键盘事件以及输入设备从UI包中独立成INPUT包,虽然使UI包的使用绑定到了INPUT包上,但换来的好处是INPUT包的重利用性。
(06-12-12)
对于模态窗口来说,他阻止了输入事件的传递,也就是说,任何不属于他处理的事件都将被丢弃。所以,我们可以在原来的panel类里面稍微改进,即可实现模态效果。
在处理鼠标和键盘事件的时候,先把事件交给他的子组件处理,然后,如果是模态panel,则丢掉事件。