2013-09-18 3 views
1

Я пишу приложение с использованием 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

Вам необходимо использовать 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" 
2

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

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

Смежные вопросы