| 
 | 
 
接上篇本文主要讨论盖莫游戏引擎中UI部分的控件基类 
 
UI控件应该包括以下几个功能 
1.按名生成 
2.控件尺寸 
3.控件大小 
4.控件状态 
5.对消息事件的处理 
6.控件渲染 
7.控件检测 
8.控件文本 
然后具体代码如下: 
/////////////////////////////////////////////////////////// 
/// 定义UI控件基类 
/////////////////////////////////////////////////////////// 
class GAPI UI_Widget : public SlotHolder,public UI_EventHandler,public Object 
{ 
public: 
    typedef std::list<UI_EventListener*> UIEventListener; 
    typedef std::list<UI_EventListener*>::iterator UIEventListenerItr; 
public: 
    //////////////////////////////////////////////////////// 
    /// 窗体构造和析构 
    //////////////////////////////////////////////////////// 
    explicit UI_Widget(UI_Widget* parent = NULL,const engine_wstring& text = L"widget"); 
    virtual ~UI_Widget(); 
public: 
    //////////////////////////////////////////////////////// 
    /// 获取,设置设置窗体文本 
    //////////////////////////////////////////////////////// 
    engine_wstring GetText()const{return text_;} 
    void SetText(const engine_wstring& text); 
public: 
    //////////////////////////////////////////////////////// 
    /// 窗体大小和尺寸 
    //////////////////////////////////////////////////////// 
    Size  GetSize()const; 
    void  SetSize(const Size& size); 
    Point GetPosition()const; 
    void  SetPosition(const Point& point); 
 
    //////////////////////////////////////////////////////// 
    /// 获取窗体推荐大小 
    //////////////////////////////////////////////////////// 
    virtual Size GetRecommendedSize()const; 
public: 
    //////////////////////////////////////////////////////// 
    /// 检测给定点下控件 
    //////////////////////////////////////////////////////// 
    UI_Widget* GetWidgetBelow(int x,int y); 
 
    //////////////////////////////////////////////////////// 
    /// 获取本控件的顶层控件 
    //////////////////////////////////////////////////////// 
    UI_Widget* GetTopWidget()const; 
 
    //////////////////////////////////////////////////////// 
    /// 获取,设置父窗体 
    //////////////////////////////////////////////////////// 
    UI_Widget* GetParentWidget()const; 
    void  SetParentWidget(UI_Widget* parent); 
public: 
    //////////////////////////////////////////////////////// 
    /// 设置,获取控件边框 
    //////////////////////////////////////////////////////// 
    void SetBorder(const RefPtr<UI_AbstractBorder>& border); 
    RefPtr<UI_AbstractBorder> GetBorder()const; 
    //////////////////////////////////////////////////////// 
    /// 设置,获取是否渲染边框 
    //////////////////////////////////////////////////////// 
    void SetBorderVisible(bool visible); 
    bool IsBorderVisible(); 
public: 
    //////////////////////////////////////////////////////// 
    /// 增加,移除事件消息 
    //////////////////////////////////////////////////////// 
    void AddEventListener(UI_EventListener* listener); 
    void RemoveEventListener(UI_EventListener* listener); 
    //////////////////////////////////////////////////////// 
    /// 消息处理 
    //////////////////////////////////////////////////////// 
    virtual bool Process(const UI_Event& event); 
public: 
    //////////////////////////////////////////////////////// 
    /// 焦点函数 
    //////////////////////////////////////////////////////// 
    bool IsFocusOn()const; 
    void SetFocusOn(bool focus); 
    void ChangedFocusOn(); 
 
    //////////////////////////////////////////////////////// 
    /// 设置,检测是否为活动控件 
    //////////////////////////////////////////////////////// 
    void SetAsActiveWidget(); 
    bool IsActiveWidget()const; 
 
    //////////////////////////////////////////////////////// 
    /// 检测控件层次关系 
    //////////////////////////////////////////////////////// 
    virtual bool DoesHierarchyContain(UI_Widget* widget)const; 
public: 
    //////////////////////////////////////////////////////// 
    /// 显示,隐藏窗体 
    //////////////////////////////////////////////////////// 
    void SetVisible(bool visible); 
    void Show(); 
    void Hide(); 
    bool IsVisible()const; 
 
    //////////////////////////////////////////////////////// 
    /// 窗体状态函数 
    //////////////////////////////////////////////////////// 
    void IsEnable(){enabled_ = true;} 
    void Disable(){enabled_ = false;} 
    bool IsEnabled()const{return enabled_;} 
public: 
    //////////////////////////////////////////////////////// 
    /// 窗体渲染 
    //////////////////////////////////////////////////////// 
    void Render(); 
 
    //////////////////////////////////////////////////////// 
    /// 当窗体关闭的时候发射信号 
    //////////////////////////////////////////////////////// 
    Signal0 closed_; 
 
     //////////////////////////////////////////////////////// 
    /// 窗体数据载入 
    //////////////////////////////////////////////////////// 
    virtual bool Load(const engine_string& file,const engine_string& widget); 
protected: 
    //////////////////////////////////////////////////////// 
    /// 执行函数 
    //////////////////////////////////////////////////////// 
    virtual void OnResize(){} 
    virtual void OnMove(){} 
    virtual void OnTextChanged(){} 
    virtual void OnShow(){} 
    virtual void OnHide(){} 
    virtual void OnGainedFocus(){} 
    virtual void OnLostFocus(){} 
    virtual void OnDraw(){} 
private: 
    UI_Widget*         parent_; 
    UIEventListener    message_listeners_; 
    engine_wstring     text_; 
    Size               size_; 
    Point              position_; 
    bool               visible_; 
    bool               enabled_; 
    RefPtr<UI_AbstractBorder> border_; 
    bool               border_visible_; 
private: 
    DECLARE_OBJECT(UI_Widget) 
}; 
 
} 
 
#ifdef G_COMPILER_MSVC 
#pragma warning(pop) 
#endif 
 
需要说明的就是这里有3个父类 
一个是Object 
一个是SlotHolder这是消息桩 
另外一个是UI_EventHandler负责对事件的处理 
 
需要说明的是UI_Widget总是和UI_WidgetManager配合使用的 
毕竟UI上下文最大只能有一个活动控件 |   
 
 
 
 |