/* gc.c */ /* creation de GC et dessin de rectangles*/ #include <stdio.h> #include <X11/Xlib.h> GC gc1, gc2; Display *display; int screen; Window win, root; unsigned long white_pixel, black_pixel, val_gc_masq; XGCValues gc_valeurs; int x1, x2, y1, y2; main() { display = XOpenDisplay (""); screen = DefaultScreen (display); root = RootWindow (display, screen); white_pixel = WhitePixel (display, screen); black_pixel = BlackPixel (display, screen); win = XCreateSimpleWindow (display, root, 0, 0, 200, 200, 2, black_pixel, white_pixel); XSelectInput (display, win, ButtonReleaseMask | ButtonPressMask); XStoreName (display, win, "gc"); XMapWindow (display, win); gc2 = XCreateGC (display, win, 0, 0); val_gc_masq = 0; gc_valeurs.background = white_pixel; val_gc_masq = val_gc_masq | GCBackground ; gc_valeurs.line_width = 3; val_gc_masq = val_gc_masq | GCLineWidth ; gc_valeurs.plane_mask = black_pixel ^ white_pixel; val_gc_masq = val_gc_masq | GCPlaneMask ; XChangeGC (display, gc2, val_gc_masq, &gc_valeurs); XSetForeground (display, gc2, black_pixel); XSetFunction (display, gc2, GXcopy); gc1 = XCreateGC (display, win, val_gc_masq, &gc_valeurs); XSetFunction (display, gc1, GXinvert); for (;;) { XEvent ev; XNextEvent (display, &ev); switch (ev.type) { case ButtonPress : x1 = ev.xbutton.x ; y1 = ev.xbutton.y ; break; case ButtonRelease : x2 = ev.xbutton.x ; y2 = ev.xbutton.y ; if ((x2 > x1) && (y2 > y1)) { if (ev.xbutton.button == Button1) XDrawRectangle (display, win, gc2, x1, y1, x2-x1, y2-y1); else if (ev.xbutton.button == Button3) XDrawRectangle (display, win, gc1, x1, y1, x2-x1, y2-y1); else if (ev.xbutton.button == Button2) XFillRectangle (display, win, gc2, x1, y1, x2-x1, y2-y1); } break; default : break; } } }
Enfoncez un bouton de souris pour définir le coin haut gauche puis relachez pour définir le coin bas droite du rectangle à dessiner : Bouton1 pour un cadre rectangulaire normal, Bouton3 idem en mode invert, Bouton2 pour un rectangle plein.
GC graphic context : ressource définisant les multiples paramètres nécessaires aux requêtes de dessin : couleur de dessin, couleur de fond, épaisseur de trait, fonte, ... Cela évite de spécifier une longue liste de tous ces paramètres à chaque opération de dessin. Par exemple, XDrawString utilise un gc pour dessiner un texte : fonte, couleur de trait, ...
XCreateGC crée une ressource gc, attachée à l'écran, à partir des valeurs de xgcvaleurs sélectionnées dans le masque xgc_masq.
XChangeGC change certaines valeurs de gc à partir de xgcvaleurs seulement celles sélectionnées dans le masque xgc_masq.
XSetForeground change facilement le foreground de gc. Comme XSetFunction, XSetBackground, XSet....
XGetGCValues récupère dans xgcvaleurs les valeurs de gc sélectionnées dans le masque xgc_masq.
XDrawRectangle dessine un rectangle et XFillRectangle dessine un rectangle plein dans fenêtre selon les spécifications de gc.
Dans une fenêtre, dessinez un rectangle de 20 sur 20. Déplacez-le à l'endroit de chaque clic de souris (donc effacez-le de son ancienne position).
programme suivant | index général | fonctions de la XLib | événements | types dans XLib |