Изменение цвета рисунка с помощью 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 снова, чтобы изменить цвет?

2 ответа

Решение

Вам нужно использовать 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);

Кроме того, я не думаю, что вы можете использовать эту цветную строку. Взгляните на эту страницу:

Числовая спецификация цвета состоит из имени цветового пространства и набора значений в следующем синтаксисе:

<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"
//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 );

}

Все изменения цвета выполняются относительно определенного GC. Этот GC затем используется для рисования. да XSetForeground это самый удобный способ сделать это.

Вы можете иметь несколько GC, если у вас есть несколько цветов, которые вы часто используете.

Другие вопросы по тегам