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中可以通过以下步骤来获取字体编号表中的内容:

  1. 更新字体编号表
    可以通过Fl::set_fonts静态方法(注意这里fonts中有s)来让FLTK搜寻系统中的字体并储存到字体编号表中。其函数原型如下,其中xstarname是一个字符数组,用来描述要添加的字体集 。传递空指针表示选取ISO8859-1编码的字体,而传递-*表示选取所有字体(WIN平台)。一般建议参数选-*,具体说明可以参考官方文档
Fl_Font Fl::set_fonts(const char* xstarname=0);
  1. 获取字体编号
    可以通过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 查看本文章

猜你喜欢

转载自blog.csdn.net/willian113/article/details/106693210