終於把SmartGUi庫寫了一半,基本的架子算是搭起來了
現在我打算編寫博客邊做開發
雖然說之前也做過GUI,但是這次還是想把這個做好點(要是一不小心和CEGUI或者MYGUI起名那就不錯了哈哈)
先說GUI字體接口吧
需要說在的 這個庫的定位是與具體渲染機器無關
那麼我們就需要一個與具體渲染有關的插件了
很顯然,對於GUI來說主要有3個部分
1.紋理/位圖
2.字體
3.基本圖元的繪制
當然還有其他...
下面這是基本字體的抽象基類 CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFont : public Object
{
public:
const static int LEFT = -1;
const static int TOP = -1;
const static int CENTER = 0;
const static int RIGHT = 1;
const static int BOTTOM = 1;
public:
virtual ~GFont();
virtual gstring GetFileName()const = 0;
virtual int GetFontSize() = 0;
virtual int GetLineHeight() const = 0;
virtual int GetWidth(const gstring& text) const = 0;
virtual int GetHitCharIndex(const gstring& text,float offset)const = 0;
virtual void Render(const gstring& text,const Recti& area,
int halignment = CENTER,
int valignment = CENTER,
bool oneline = true) = 0;
DECLARE_OBJECT(GFont)
};
CORE_END_NAMESPACE
函數功能基本都看的懂
需要說明的是
1.GetHitCharIndex是本文給定偏移對於的字符標號
2.這裡並沒有提供一個渲染給定文本在給定位置的功能,反而提供了一個更為貼心的Render渲染文本於給定矩形-可以指定對其方式和是否為多行渲染
3.這裡還沒有提供一些更為復雜的字體性質,比如斜體,下劃線,粗體等等
一個相關的字體工廠對象如下: CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFontFactory : public Object
{
public:
virtual ~GFontFactory();
virtual boost::shared_ptr<GFont> CreateFont(const gstring& font,int size) = 0;
DECLARE_OBJECT(GFontFactory)
};
CORE_END_NAMESPACE這個沒什麼說的,根據字體文件和字體大小生成字體指針一枚
還有一個相關對象是FontManager
接口如下: CORE_BEGIN_NAMESPACE
class GUI_EXPORT GFontManager:
public Manager<boost::shared_ptr<GFont> >,
public GSerializer
{
public:
bool AddFont(const gstring& name,const gstring& font,int size,bool del = false);
gstring GetSerializerTag(){return "fontlist";}
bool Load(boost::shared_ptr<XMLNode> node);
bool Save(boost::shared_ptr<XMLDocument> doc,boost::shared_ptr<XMLNode>& node);
apiuse
void SetFontFactory(boost::shared_ptr<GFontFactory> factory);
private:
boost::shared_ptr<GFontFactory> factory;
DEFINE_SINGLETON(GFontManager)
};
CORE_END_NAMESPACE
1.顯然字體管理器是一個單件
2.函數SetFontFactory()是提供給插件設置具體的字體工廠的,所以這裡有一個標記apiuse
3.函數GetSerializerTag,Load,Save是從對那象GSerializer繼承來的,目的就是提供字體的序列化和反序列化動作-我們的GUI是要盡可能做到自動化的
在SmartGUI中,字體系統基本上就由這三個對象,以後樣子改動不會太大了,也許只會增加函數接口而已
另外這個字體系統從設計模式的角度看是很容易理解的
----------------------------------------------------------標記
接口總比實現重要些.