Quantcast
Channel: C++博客-Cpper-随笔分类-Game引擎
Viewing all articles
Browse latest Browse all 30

UI设计概要4:UI基件

$
0
0
接上篇
我们接着说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上下文最大只能有一个活动控件


ccsdu2009 2010-10-20 18:19 发表评论

Viewing all articles
Browse latest Browse all 30

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>