我想为我在X11图形窗口上绘制的不同对象放置不同的颜色。
Example:这是通用代码,我们用于指定窗口显示的颜色,从而指定在其上绘制的对象的颜色。XAllocNamedColor(display, DefaultColormap(display, screen),"red", &color,&dummy);
在下面显示的代码中,直线和矩形均显示为红色。有什么办法可以显示红色的线条和蓝色的矩形?我需要对代码进行哪些更改?
#include <stdio.h>
#include <X11/Xlib.h>
#include <unistd.h>
#include <math.h>
#include "time.h"
#include "sys/time.h"
Display *display;
Window window;
XSetWindowAttributes attributes;
XGCValues gr_values;
XFontStruct *fontinfo;
GC gr_context;
Visual *visual;
int depth;
int screen;
XEvent event;
XColor color, dummy;
main (argc, argv)
char *argv[];
int argc;
{
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
visual = DefaultVisual(display,screen);
depth = DefaultDepth(display,screen);
attributes.background_pixel = XWhitePixel(display,screen);
window = XCreateWindow( display,XRootWindow(display,screen),
0, 0, 1250, 1200, 5, depth, InputOutput,
visual ,CWBackPixel, &attributes);
XSelectInput(display,window,ExposureMask | KeyPressMask) ;
fontinfo = XLoadQueryFont(display,"6x10");
XAllocNamedColor(display, DefaultColormap(display, screen),"red",
&color,&dummy);
gr_values.font = fontinfo->fid;
gr_values.foreground = color.pixel;
gr_context=XCreateGC(display,window,GCFont+GCForeground, &gr_values);
XFlush(display);
XMapWindow(display,window);
XFlush(display);
while(1){
XNextEvent(display,&event);
switch(event.type){
case Expose:
XDrawLine(display,window,gr_context,800,800, 400, 450);
XDrawRectangle(display,window,gr_context,i+10,j+10, 200, 150);
break;
case KeyPress:
XCloseDisplay(display);
exit(0);
}
}
}
在X11中,您将颜色添加到图形上下文(GC),作为参数传递给XDrawLine,等等。您的程序可能调用XCreateGC来创建图形上下文。您可以通过对其遮罩GCForeground和/或GCBackground进行“或”运算来设置前景色和/或背景色,然后将从Pixel
中获得的XAllocNamedColor
值(在XColor
值中)复制到XGCValues的前景色/创建GC时的背景结构成员。
XColor
值具有颜色的R / G / B分类(回答后续问题)。您可以使用XAllocColor
将R / G / B值转换为像素值(例如,参见XAllocColor
)。