接上篇
我們接著說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上下文最大只能有一個活動控件