终于把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中,字体系统基本上就由这三个对象,以后样子改动不会太大了,也许只会增加函数接口而已
另外这个字体系统从设计模式的角度看是很容易理解的
----------------------------------------------------------标记
接口总比实现重要些.