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

如何在C语言Xlib中修改已创建X11窗口的背景色?

窗口创建完成后修改Xlib窗口背景色

要在窗口创建完成后动态修改背景色,你可以借助Xlib的XSetWindowBackground配合XClearWindow,或者直接使用绘图上下文(GC)填充整个窗口区域。以下是具体实现方案:

问题分析

你的现有代码仅在初始化窗口时设置了背景色,未实现后续修改逻辑;且直接传入数字作为颜色值不规范,Xlib需要通过颜色映射(Colormap)分配正确的像素值才能保证颜色在当前显示环境中生效。

解决方案代码

#include <X11/Xlib.h>
#include <unistd.h>   
#define NIL (0)       

// 辅助函数:将颜色名称转为对应像素值
Pixel get_color_pixel(Display *dpy, const char *color_name) {
    Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy));
    XColor color;
    XParseColor(dpy, cmap, color_name, &color);
    XAllocColor(dpy, cmap, &color);
    return color.pixel;
}

void graphic() {
    Display *dpy = XOpenDisplay(NIL); 
    Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 500, 500, 
                                  0, get_color_pixel(dpy, "black"), get_color_pixel(dpy, "lightgray")); 

    XMapWindow(dpy, w);
    XClearWindow(dpy, w);
    XFlush(dpy);

    // 等待5秒后第一次修改背景色
    sleep(5);

    // 方法1:修改窗口背景属性并刷新
    XSetWindowBackground(dpy, w, get_color_pixel(dpy, "blue"));
    XClearWindow(dpy, w);
    XFlush(dpy);

    // 等待5秒后第二次修改背景色
    sleep(5);

    // 方法2:用GC直接填充整个窗口区域
    GC gc = XCreateGC(dpy, w, 0, NIL);
    XSetForeground(dpy, gc, get_color_pixel(dpy, "red"));
    XFillRectangle(dpy, w, gc, 0, 0, 500, 500);
    XFlush(dpy);

    // 停留观察效果
    sleep(10);

    // 清理资源
    XFreeGC(dpy, gc);
    XCloseDisplay(dpy);
}

int main(){
    graphic();
    return 0;
}

关键步骤说明

  • 颜色值处理:通过get_color_pixel函数,先用XParseColor解析颜色名称,再用XAllocColor从默认颜色映射中分配对应像素值,避免直接传数字导致的颜色失效问题。
  • 方法1:修改背景属性:
    1. XSetWindowBackground:更新窗口的背景色属性。
    2. XClearWindow:强制窗口用新背景色重绘整个区域,让修改生效。
  • 方法2:直接绘制填充:
    1. 创建绘图上下文(GC),设置前景色为目标颜色。
    2. XFillRectangle绘制覆盖整个窗口的矩形,直接填充为指定颜色。

编译时需链接Xlib库:

gcc your_code.c -o window_color -lX11

内容的提问来源于stack exchange,提问作者SITRUUNA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:33:12