如何使用Xlib从文件中绘制图像到窗口上

5
这是我的代码:

int main()
{
    Display *d = XOpenDisplay(0);
    unsigned int bitmap_width, bitmap_height;
    int x, y;
    Pixmap bitmap;

    if ( d )
    {
        Window w = XCreateWindow(d, DefaultRootWindow(d), 0, 0, 400,
                   400, 0, CopyFromParent, CopyFromParent,CopyFromParent, 0, 0);
        GC gc = XCreateGC ( d, w, 0 , NULL );

        int rc = XReadBitmapFile(d, w,
             "1.bmp",
             &bitmap_width, &bitmap_height,
             &bitmap,
             &x, &y);

        XCopyPlane(d, bitmap, w, gc,0, 0, bitmap_width, bitmap_height,0, 0, 1);
        XMapWindow(d, w);
        XFlush(d);
        sleep(10);
    }
    return 0;
}

但是窗口是透明的。我不明白为什么它不起作用。我哪里出错了?


2
前两个错误包括没有正确格式化您的代码,以及没有标记您正在使用的编程语言的问题。 - Cody Gray
你为什么要睡十秒钟? - Sebastian Mach
抱歉,我是新用户,忘记了格式。我要睡10秒钟来查看窗口。 - user725803
@phresnel:睡眠是代替编写任何事件处理代码的,这会分散注意力并与手头的问题无关。它只是映射窗口(将其绘制到屏幕上),XFlush 强制显示窗口(X 协议是异步的),等待 10 秒钟,然后(粗暴地)销毁窗口并通过简单退出(在 return 0 处)拆除与 X 服务器的连接。 - mctylr
1个回答

12

通常你需要创建自己的加载器来获取你所需的任何图像格式的像素。

然后,你使用 XCreateImage 创建一个 XImage,并使用 XPutImage 将其放置在通过 XCreatePixmap 生成的离屏 pixmap 上。一旦你有了你的 pixmap,你可以使用 XCopyArea 将它绘制到窗口中。你必须在任何暴露事件上重新复制图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接