程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> SmartGUI庫字體接口

SmartGUI庫字體接口

編輯:關於C語言

終於把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中,字體系統基本上就由這三個對象,以後樣子改動不會太大了,也許只會增加函數接口而已

另外這個字體系統從設計模式的角度看是很容易理解的

----------------------------------------------------------標記
接口總比實現重要些.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved