当前位置:编程学习 > C/C++ >>

SmartGUI库字体接口

终于把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中,字体系统基本上就由这三个对象,以后样子改动不会太大了,也许只会增加函数接口而已

另外这个字体系统从设计模式的角度看是很容易理解的

----------------------------------------------------------标记
接口总比实现重要些.

 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,