Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
接上篇
我们接着说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上下文最大只能有一个活动控件
posted on 2010-10-20 18:19 ccsdu2009 阅读(1996) 评论(4)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: UI设计概要4:UI基件[未登录]
    by
    Posted @ 2010-10-21 13:43
    我以前也是这么做,后来觉得,其实显示部分和事件处理,逻辑算法这些可以分开。
    也就是一个显示元素树,和一个逻辑元素树,这样逻辑会更清晰。貌似MS的WPF那套也是这么干的吧。  回复  更多评论   
  • # re: UI设计概要4:UI基件
    2009
    Posted @ 2010-10-21 14:34
    @by
    呵呵 这个不管如何
    基本都是2个面
    1个显示
    1个逻辑  回复  更多评论   
  • # re: UI设计概要4:UI基件
    沫沫
    Posted @ 2010-10-23 23:55
    你这应该是模范chrome的代码写的吧。。太像了  回复  更多评论   
  • # re: UI设计概要4:UI基件
    2009
    Posted @ 2010-10-24 16:39
    @沫沫
    不是  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理