使用Xlib更改绘图颜色

时间:2013-09-18 17:11:36

标签: c++ c xlib

我正在使用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来改变颜色?

3 个答案:

答案 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 );

}