Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
当前在做引擎的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部分
posted on 2010-06-08 18:48 ccsdu2009 阅读(1654) 评论(9)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: 盖莫游戏引擎-GUI-消息系统
    陈梓瀚(vczh)
    Posted @ 2010-06-08 19:06
    Event<void(int,int)> == vector<function<void(int,int)>>  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    ccsdu2009
    Posted @ 2010-06-08 19:15
    @陈梓瀚(vczh)
    function<void(int,int)>
    在boost里面有这样的东西啊  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    杨粼波
    Posted @ 2010-06-08 21:52
    用boost::signal足矣.  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    陈梓瀚(vczh)
    Posted @ 2010-06-08 23:01
    @ccsdu2009
    VC++2010有TR1,就有了

    我自己也实现过,可以参考vlpp.codeplex.com  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    ccsdu2009
    Posted @ 2010-06-09 08:43
    @杨粼波
    我不打算在表层使用boost !  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    ccsdu2009
    Posted @ 2010-06-09 08:44
    @陈梓瀚(vczh)
    这个我知道
    但是vc2008,devc++不一定有吧  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    陈梓瀚(vczh)
    Posted @ 2010-06-09 14:00
    @ccsdu2009
    gcc新版的也有,08没有。  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统[未登录]
    姚冬
    Posted @ 2010-06-10 09:53
    可以考虑 用 sigslot
    http://sigslot.sourceforge.net/
    就一个头文件,很轻量的 signal/slot实现
      回复  更多评论   
  • # re: 盖莫游戏引擎-GUI-消息系统
    ccsdu2009
    Posted @ 2010-06-10 10:42
    @姚冬
    就是这个的变种  回复  更多评论   

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理