使用Xlib更改绘图颜色

问题描述 投票:1回答:2

我正在使用Xlib编写应用程序。我将窗口的前景设置为:

XSetForeground (dpy, gc, WhitePixel (dpy, scr));

但现在我需要将绘图颜色更改为其他颜色,我首先要这样做:

void update_window (Display* d, Window w, GC gc, Colormap cmap) 
{
    XWindowAttributes winatt;
    XColor bcolor;
    char bar_color[] = "#4E4E4E";

    XGetWindowAttributes (d, w, &winatt);

    XParseColor(d, cmap, bar_color, &bcolor);
    XAllocColor(d, cmap, &bcolor);

    // Draws the menu bar.
    XFillRectangle (d, w, gc, 0, 0, winatt.width, 30);

    XFreeColormap (d, cmap);
}

但这不起作用。那么XParseColor和XAllocColor会做什么?我是否需要再次使用XSetForeground来改变颜色?

c++ c xlib
2个回答
3
投票

你需要使用XSetForeground。尝试这样的事情:

XColor xcolour;

// I guess XParseColor will work here
xcolour.red = 32000; xcolour.green = 65000; xcolour.blue = 32000;
xcolour.flags = DoRed | DoGreen | DoBlue;
XAllocColor(d, cmap, &xcolour);

XSetForeground(d, gc, xcolour.pixel);
XFillRectangle(d, w, gc, 0, 0, winatt.width, 30);
XFlush(d);

另外,我认为你不能使用那个颜色字符串。看看this页面:

数字颜色规范由颜色空间名称和以下语法中的一组值组成:

<color_space_name>:<value>/.../<value>

以下是有效颜色字符串的示例。

"CIEXYZ:0.3227/0.28133/0.2493"
"RGBi:1.0/0.0/0.0"
"rgb:00/ff/00"
"CIELuv:50.0/0.0/0.0"

编辑/更新:正如@JoL在评论中提到的那样,您仍然可以使用旧语法but the usage is discouraged

为了向后兼容,支持RGB设备的旧语法,但不鼓励继续使用它。语法是一个初始的尖锐符号字符,后跟数字规范,采用以下格式之一:


2
投票

所有颜色变化都是针对某个GC完成的。那个GC然后用于绘图。是的XSetForeground是最方便的方法。

如果你经常使用一些颜色,你可以拥有几个GC。

© www.soinside.com 2019 - 2024. All rights reserved.