You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kali Linux下使用Xlib创建窗口,文本无法显示的问题求助

问题:Xlib窗口正常显示但文本无法渲染
  • 使用Xlib创建窗口,窗口能正常显示,但「Hello, World!」文本无法出现
  • 已尝试调整文本与背景颜色,无效果
  • 运行环境:Kali Linux

核心问题分析

  1. 未处理窗口重绘事件:窗口映射完成后,后续的Expose(窗口暴露)事件会清除初始绘制的内容,原代码仅处理了MapNotify事件,未响应重绘请求,导致文本被覆盖。
  2. 字体加载不可靠: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:35:25