当前在做引擎的GUI部分
设计的的首要原则是先做出来,如果有什么问题以后再改
当然GUI消息事件是这样设计的
事件和听者是2个模板
///////////////////////////////////////////////////////////
/// 定义引擎事件基类模板
///////////////////////////////////////////////////////////
template<class EventType = int>
class Event : NonCopyable
{
public:
///////////////////////////////////////////////////////
/// 事件基类构造函数
///////////////////////////////////////////////////////
Event(const EventType& type):type_(type){}
////////////////////////////////////////////////////////
/// 事件基类析构函数
////////////////////////////////////////////////////////
virtual ~Event(){}
////////////////////////////////////////////////////////
/// 获取事件类型
////////////////////////////////////////////////////////
EventType GetEventType()const{return type_;}
private:
////////////////////////////////////////////////////////
/// 数据成员变量
////////////////////////////////////////////////////////
EventType type_;
};
////////////////////////////////////////////////////////////
/// 定义事件听者基类
////////////////////////////////////////////////////////////
template<class Event,class Object>
class EventListener
{
public:
////////////////////////////////////////////////////////
/// 事件听者虚析构函数
////////////////////////////////////////////////////////
virtual ~EventListener(){}
////////////////////////////////////////////////////////
/// 消息派送
////////////////////////////////////////////////////////
virtual bool Dispatch(const Event& message,Object* object) = 0;
};
可以看出这并不属于GUI部分
在GUI中有
typedef Event<UI_EVENT> UIEvent;
typedef EventListener<UIEvent,Widget> UIEventListener;
每一个控件可能都需要处理消息
所以控件有一个函数
////////////////////////////////////////////////////////
/// 消息处理
////////////////////////////////////////////////////////
virtual bool Process(const UIEvent& event);
来响应消息事件
基本的GUI事件有2类 一个是鼠标事件 一个是按键事件
所有有2个对象
class KeyEvent
class MouseEvent
对于鼠标还有几个派生的对象比如双击事件等
控件需要处理UI事件那么在GUI的某个部分需要生成UI事件
当然事件的生产在UIWidgetManager中
启用管理器的事件载入Input指针参数
然后不断检查鼠标和按键状态生成相关事件然后传递给相关控件
我认为GUI设计有点难度
但是相对来说GUI编辑器应该更难
小注:理想的编辑器应该是这样
通过编辑器生成控件配置文件(比如xml)
使用的时候只需要调用配置文件动态生成对等的控件,当然包含事件处理喽
最后上一个半成品的图图
(cppblog似乎对firefox兼容不好?)
下一篇说控件Surface和Border部分