終于把SmartGUi庫寫了一半,基本的架子算是搭起來了
現(xiàn)在我打算編寫博客邊做開發(fā)
雖然說之前也做過GUI,但是這次還是想把這個做好點(diǎn)(要是一不小心和CEGUI或者M(jìn)YGUI起名那就不錯了哈哈)
先說GUI字體接口吧
需要說在的 這個庫的定位是與具體渲染機(jī)器無關(guān)
那么我們就需要一個與具體渲染有關(guān)的插件了
很顯然,對于GUI來說主要有3個部分
1.紋理/位圖
2.字體
3.基本圖元的繪制
當(dāng)然還有其他...
下面這是基本字體的抽象基類
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
函數(shù)功能基本都看的懂
需要說明的是
1.GetHitCharIndex是本文給定偏移對于的字符標(biāo)號
2.這里并沒有提供一個渲染給定文本在給定位置的功能,反而提供了一個更為貼心的Render渲染文本于給定矩形-可以指定對其方式和是否為多行渲染
3.這里還沒有提供一些更為復(fù)雜的字體性質(zhì),比如斜體,下劃線,粗體等等
一個相關(guān)的字體工廠對象如下:
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
這個沒什么說的,根據(jù)字體文件和字體大小生成字體指針一枚
還有一個相關(guān)對象是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.函數(shù)SetFontFactory()是提供給插件設(shè)置具體的字體工廠的,所以這里有一個標(biāo)記apiuse
3.函數(shù)GetSerializerTag,Load,Save是從對那象GSerializer繼承來的,目的就是提供字體的序列化和反序列化動作-我們的GUI是要盡可能做到自動化的
在SmartGUI中,字體系統(tǒng)基本上就由這三個對象,以后樣子改動不會太大了,也許只會增加函數(shù)接口而已
另外這個字體系統(tǒng)從設(shè)計(jì)模式的角度看是很容易理解的
----------------------------------------------------------標(biāo)記
接口總比實(shí)現(xiàn)重要些.