我正在使用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来改变颜色?
答案 0 :(得分: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设备的旧语法,但不鼓励继续使用它。语法是一个初始的尖锐符号字符,后跟数字规范,采用以下格式之一:
答案 1 :(得分:2)
所有颜色更改都是针对某个GC完成的。那个GC然后用于绘图。是XSetForeground
是最方便的方法。
如果你经常使用一些颜色,你可以拥有几个GC。
答案 2 :(得分:1)
//I write additional function _RGB(...) where r,g,b is components in range 0...255
unsigned long _RGB(int r,int g, int b)
{
return b + (g<<8) + (r<<16);
}
void some_fun()
{
//sample set color, where r=255 g=0 b=127
XSetForeground(display, gc, _RGB(255,0,127));
//draw anything
XFillRectangle( display, window, gc, x, y, len, hei );
}