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