Kali Linux下使用Xlib创建窗口,文本无法显示的问题求助
问题:Xlib窗口正常显示但文本无法渲染
- 使用Xlib创建窗口,窗口能正常显示,但「Hello, World!」文本无法出现
- 已尝试调整文本与背景颜色,无效果
- 运行环境:Kali Linux
核心问题分析
- 未处理窗口重绘事件:窗口映射完成后,后续的
Expose(窗口暴露)事件会清除初始绘制的内容,原代码仅处理了MapNotify事件,未响应重绘请求,导致文本被覆盖。 - 字体加载不可靠:
XLoadFont在现代X11环境中可能无法正确加载「fixed」字体,需改用更稳定的加载方式。
修复后的代码
#include <X11/Xlib.h> #include <X11/Xutil.h> int main() { // 初始化显示 Display* display = XOpenDisplay(NULL); if (!display) return 1; int screen = DefaultScreen(display); Window root = DefaultRootWindow(display); // 创建窗口 Window window = XCreateSimpleWindow(display, root, 0, 0, 640, 480, 0, BlackPixel(display, screen), WhitePixel(display, screen)); // 设置窗口标题 XStoreName(display, window, "My Window"); // 注册需要处理的事件 XSelectInput(display, window, ExposureMask | KeyPressMask); // 映射窗口到屏幕 XMapWindow(display, window); // 创建图形上下文 GC gc = XCreateGC(display, window, 0, NULL); XSetForeground(display, gc, BlackPixel(display, screen)); // 加载字体(更可靠的方式) XFontStruct* font = XLoadQueryFont(display, "fixed"); if (font) { XSetFont(display, gc, font->fid); } else { // 加载失败时回退到默认字体 XSetFont(display, gc, XGContextFromGC(gc)); } XEvent event; while (1) { XNextEvent(display, &event); switch (event.type) { case Expose: // 每次窗口需要重绘时重新绘制文本 XDrawString(display, window, gc, 10, 30, "Hello, World!", 13); XFlush(display); break; case KeyPress: // 按键触发程序退出,释放资源 XFreeGC(display, gc); if (font) XFreeFont(display, font); XCloseDisplay(display); return 0; } } return 0; }
关键修复说明
- 添加事件掩码:通过
XSelectInput注册ExposureMask,让程序能捕获窗口重绘请求 - 重绘时重新绘制文本:在
Expose事件回调中执行文本绘制,确保窗口内容被清除后能重新渲染 - 优化字体加载:用
XLoadQueryFont替代XLoadFont,加载失败时自动回退到默认字体,避免因字体问题导致文本不显示 - 添加退出逻辑:监听
KeyPress事件,按下任意键即可退出程序,避免无限循环
内容的提问来源于stack exchange,提问作者ALX
相关产品推荐
相关产品推荐

