FLTK中的字体
FLTK中的字體
- 字體在FLTK中的表示
- 獲取系統的字體編號表
- 程序示例
字體在FLTK中的表示
在FLTK中,系統中的每一種字體都對應著一個整數類型(嚴格來講是Fl_Font類型,但Fl_Font本身就是int的別名)的字體編號。例如,在本人的系統中“楷體”所對應的字體編號為618。
在創建控件后,可以通過labelfont(int)方法來設施其所顯示的字體。例如,下列代碼創建了一個字體為楷體的Fl_Box對象:
Fl_Box pBox = new Fl_Box(0, 0, 200, 30, "這是楷體"); pBox->labelfont(618);獲取系統的字體編號表
FLTK用字體編號表(Face table)來存儲系統中的字體編號和字體名稱的對應關系。
在FLTK中可以通過以下步驟來獲取字體編號表中的內容:
可以通過Fl::set_fonts靜態方法(注意這里fonts中有s)來讓FLTK搜尋系統中的字體并儲存到字體編號表中。其函數原型如下,其中xstarname是一個字符數組,用來描述要添加的字體集 。傳遞空指針表示選取ISO8859-1編碼的字體,而傳遞-*表示選取所有字體(WIN平臺)。一般建議參數選-*,具體說明可以參考官方文檔。
可以通過Fl::get_font_name靜態方法來獲取對應字體編號的字體名稱。其輸入是字體編號,返回值是字體名稱。其函數原型如下,其中參數fnum是一個整型,代表字體編號,返回值是一個字符數組,代表字體的名稱。另一個參數attributes的用來表明所對應字體類別,分別是0-普通,1-粗體,2-斜體,3-斜黑體。具體說明可以參考官方文檔。
獲取系統的字體編號表的示例代碼如下:
int type; /* 用來存放得到字體的類型 */ int font_number = Fl::set_fonts("-*"); /* 獲取系統中字體的數目 */ for(int i=0; i<font_number; i++){ /* 找到名字為楷體的字體編號 */if(!strcmp(Fl::get_font_name(i), "楷體")){std::cout << "字體編號: " << i << "字體名稱: " << Fl::get_font_name((Fl_Font)i, &type) << std::endl;} }程序示例
下面是一個創建窗口并用不同字體顯示的示例程序:
#include <FL/Fl.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl_Box.H> #include <cstring> #include <vector> #include <iostream>int main(){char s[] = "問君能有幾多愁,恰似1群Tj上青樓~"; /* 演示文本 */std::vector<int> vecInt; /* 保存字體編號 */std::vector<Fl_Box*> vecBox; /* 保存控件的指針 */int type; /* 用來存放得到字體的類型 */int font_numbers = Fl::set_fonts("-*"); /* 獲取系統中的字體數目 *//* 打印前10種字體以及楷體的字體編號和字體名稱并保存 */ for (int i=0; i<font_numbers; i++){if (i<10){std::cout << "字體編號: " << i << ", 字體名稱: " << Fl::get_font_name((Fl_Font)i, &type);std::cout << ", 字體類型: " << ((type==0)?("普通"):((type==1)?("黑體"):((type==2)?("斜體"):((type==3)?("黑斜"):("未知"))))) << std::endl;vecInt.push_back(i);}else if (!strcmp(Fl::get_font_name((Fl_Font)i,nullptr), "楷體")){std::cout << "字體編號: " << i << ", 字體名稱: " << Fl::get_font_name((Fl_Font)i,&type);std::cout << ", 字體類型: " << ((type==0)?("普通"):((type==1)?("黑體"):((type==2)?("斜體"):((type==3)?("黑斜"):("未知"))))) << std::endl;vecInt.push_back(i);vecInt.push_back(i);}}Fl_Double_Window* pMainWindow = new Fl_Double_Window(300, 400, "字體測試");for (size_t i=0; i<vecInt.size(); i++){vecBox.push_back(new Fl_Box(0, i*30, 300, 30, s));vecBox[i]->labelfont(vecInt[i]);}pMainWindow->end();pMainWindow->show();return Fl::run(); }這里注意在編譯的時候記得加上-lfltk命令(在MSYS2上還要加上-mwindows -DWIN32 -lole32 -luuid -lcomctl32)。
其在命令行界面得到的結果如下:
字體編號: 0, 字體名稱: Arial, 字體類型: 普通 字體編號: 1, 字體名稱: Arial bold, 字體類型: 黑體 字體編號: 2, 字體名稱: Arial italic, 字體類型: 斜體 字體編號: 3, 字體名稱: Arial bold italic, 字體類型: 黑斜 字體編號: 4, 字體名稱: Courier New, 字體類型: 普通 字體編號: 5, 字體名稱: Courier New bold, 字體類型: 黑體 字體編號: 6, 字體名稱: Courier New italic, 字體類型: 斜體 字體編號: 7, 字體名稱: Courier New bold italic, 字體類型: 黑斜 字體編號: 8, 字體名稱: Times New Roman, 字體類型: 普通 字體編號: 9, 字體名稱: Times New Roman bold, 字體類型: 黑體 字體編號: 618, 字體名稱: 楷體, 字體類型: 普通創建的窗口如下:
相關鏈接
專欄:FLTK
總結
- 上一篇: iOS录音总结
- 下一篇: css如何设置动画,css3如何设置动画