06-10-30,06-12-12

(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,则丢掉事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章