如何在Xlib中选择并调整字体大小?解决XLoadFont报BadName错误
在Xlib中调整字体大小的正确方法
你当前的问题出在XLoadFont使用的字体名称格式不符合X系统的规则,而且传统Xlib字体系统本身比较老旧,这里提供两种可行的解决方案:
方案一:修复传统Xlib字体加载的格式问题
X的字体名称采用-分隔的14字段固定格式,你之前的通配符过于宽泛,导致系统找不到匹配的字体。可以通过xlsfonts命令查看系统中可用的字体名称,提取符合需求的模板,比如加载指定大小的等宽字体:
char* xfontid; // 示例:匹配像素大小为fontsize的固定宽度字体 asprintf(&xfontid, "-misc-fixed-medium-r-normal--%d-*-*-*-c-*-iso8859-1", fontsize); Font font = XLoadFont(display, xfontid); if (font == BadName) { fprintf(stderr, "无法加载指定大小的字体\n"); } else { textitem.font = font; XDrawText(display, xwindow, gc, x, y, &textitem, 1); XFreeFont(display, font); // 用完务必释放字体资源 } free(xfontid);
方案二:使用Xft(推荐,适配现代字体)
传统Xlib字体系统对TrueType/OpenType支持有限,Xft基于FreeType实现,用法更接近你熟悉的Quartz风格,无需记忆复杂的命名规则:
#include <X11/Xft/Xft.h> // 初始化Xft绘制资源 XftDraw* draw = XftDrawCreate(display, xwindow, DefaultVisual(display, screen), DefaultColormap(display, screen)); XftColor text_color; XftColorAllocName(display, DefaultVisual(display, screen), DefaultColormap(display, screen), "#000000", &text_color); // 直接指定字体族和大小,比如12号无衬线字体 XftFont* font = XftFontOpenName(display, screen, "Sans:size=12"); // 绘制UTF-8编码的文本 XftDrawStringUtf8(draw, &text_color, font, x, y, (FcChar8*)some_string, strlen(some_string)); // 释放资源 XftFontClose(display, font); XftColorFree(display, DefaultVisual(display, screen), DefaultColormap(display, screen), &text_color); XftDrawDestroy(draw);
关于BadName错误的原因
你之前使用的*-*-*-*-*-*-*-%d-*-*-*-*-*-*通配符匹配逻辑不严谨,X的字体名称每个字段都有明确含义(比如第10个字段对应像素大小),过于宽泛的通配符会导致系统找不到匹配的字体条目,因此返回BadName错误。
内容的提问来源于stack exchange,提问作者Pixie
相关产品推荐
相关产品推荐

