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_Font Fl::set_fonts(const char* xstarname=0);
- 获取字体编号
可以通过Fl::get_font_name
静态方法来获取对应字体编号的字体名称。其输入是字体编号,返回值是字体名称。其函数原型如下,其中参数fnum
是一个整型,代表字体编号,返回值是一个字符数组,代表字体的名称。另一个参数attributes
的用来表明所对应字体类别,分别是0-普通,1-粗体,2-斜体,3-斜黑体。具体说明可以参考官方文档。
const char* Fl::get_font_name(Fl_Font fnum, int* attributes=0);
获取系统的字体编号表的示例代码如下:
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
扫描二维码关注公众号,回复:
15091876 查看本文章