Afficher une fonction ou dessiner
dans une fenêtre sans connaître la Xlib

Afficher une fonction

/* plot1.c 
 * affichage de fonction
 * version simple
 */

#define LARGEUR 400 /* dimensions de la fenetre */
#define HAUTEUR 300

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

GC      gc;
Display *display;
int     screen;
Window  win, root;
unsigned long white_pixel, black_pixel;

main() {
  if ((display = XOpenDisplay ("")) == NULL) {
    fprintf (stderr, "Can't open Display\n");
    exit (1);
  }
  gc = DefaultGC (display, screen);
  screen = DefaultScreen (display);
  root = RootWindow (display, screen);
  white_pixel = WhitePixel (display, screen);
  black_pixel = BlackPixel (display, screen);
  XSetBackground (display, gc, white_pixel);
  XSetForeground (display, gc, black_pixel);
  win = XCreateSimpleWindow (display, root,
               0, 0, LARGEUR, HAUTEUR, 5, black_pixel, white_pixel);
  XSelectInput (display, win, ExposureMask);
  XStoreName (display, win, "je dessine"); /* titre de la fenetre */
  XMapWindow (display, win);

  for (;;) {
    XEvent ev;
    XNextEvent (display, &ev);
    switch (ev.type) {
    case Expose :
      XClearWindow(display, win);
      /* dessiner dans la fenêtre */
      { int x,y;
        for (x=0 ; x<100 ; x++) {
          y=2*x;
          XDrawPoint(display, win, gc, x, y);
        }
      }
      /* fin dessiner */
      break;
    default :
      break;
    }
  }
}

dessiner dans une fenêtre

/* dessin1.c 
 * dessin dans une fenetre
 * version simple
 */
#define LARGEUR 400 /* dimensions de la fenetre */
#define HAUTEUR 300

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

GC      gc;
Display *display;
int     screen;
Window  win, root;
unsigned long white_pixel, black_pixel;

main() {
  if ((display = XOpenDisplay ("")) == NULL) {
    fprintf (stderr, "Can't open Display\n");
    exit (1);
  }
  gc = DefaultGC (display, screen);
  screen = DefaultScreen (display);
  root = RootWindow (display, screen);
  white_pixel = WhitePixel (display, screen);
  black_pixel = BlackPixel (display, screen);
  XSetBackground (display, gc, white_pixel);
  XSetForeground (display, gc, black_pixel);
  win = XCreateSimpleWindow (display, root,
               0, 0, LARGEUR, HAUTEUR, 5, black_pixel, white_pixel);
  XSelectInput (display, win, ExposureMask);
  XStoreName (display, win, "je dessine"); /* titre de la fenetre */
  XMapWindow (display, win);

  for (;;) {
    XEvent ev;
    XNextEvent (display, &ev);
    switch (ev.type) {
    case Expose :
      XClearWindow(display, win);
      /* dessiner dans la fenêtre */
      { XDrawPoint(display, win, gc, 5, 5);
        XDrawString (display, win, gc, 10, 10, "texte !", 7);
        XDrawRectangle (display, win, gc, 40,40, 20, 10);
        XFillRectangle (display, win, gc, 60,60, 20, 10);
      }
      /* fin dessiner */
      break;
    default :
      break;
    }
  }
}

Fonctionnement de ces programmes :

1. établissement d'une connexion à un serveur X,
2. initialisation/création de la fenêtres et autres ressources,
3. boucle d'attente et traitement de l'évènement "expose"


GC : graphic context, contexte graphique, "trousse pour dessiner, écrire, ..."
Display : canal d'affichage
screen : numéro d'écran
Window : type fenêtre
root : fenêtre racine
pixel : blanc/noir (sans se soucier du mode graphique)

win = XCreateSimpleWindow (display, root,0, 0, LARGEUR, HAUTEUR, 5, black_pixel, white_pixel);
crée une nouvelle fenêtre win(fille de root), mais ne l'affiche pas !
La nouvelle fenêtre aura une largeur de LARGEUR points et une hauteur de HAUTEUR points, sa couleur de fond sera white_pixel.
Le coin haut-gauche de la fenêtre win a pour coordonnées (0,0) et un point en (x,y) est à x pixels (points) du bord gauche et y pixels du bord supérieur.

Les fonctions de dessin :

XDrawPoint(display, win, gc, x, y);
dessine un point en (x,y)
XDrawString (display, win, gc, x, y, chaine, nbre_car);
dessine nbre_car caractères de la chaine sur la ligne de base débutant au point (x,y)
XDrawRectangle (display, win, gc, x, y, largeur, hauteur);
dessine un rectangle de coin haut-gauche en (x,y) et de largeur et hauteur spécifiées.
XFillRectangle (display, win, gc, x, y, largeur, hauteur);
dessine un rectangle plein de coin haut-gauche en (x,y) et de largeur et hauteur spécifiées.
XDrawLine(display, win, gc, x1, y1, x2, y2)
dessine une ligne entre (x1, y1) et (x2, y2).
XDrawArc(display, win, gc, x, y, largeur, hauteur, angle1, angle2)
Les paramètres x, y, largeur, hauteur définissent une boîte contenant l'arc de cercle. Le centre de l'arc est le centre de la boîte. Les paramètres angle1 et angle2 spécifient l'arc du cercle dessiné. Ces angles sont en 1/64 degrés, mesurés dans le sens trigonométrique. L'angle de valeur zéro est à la position 3 heures. Le paramètre angle2 est mesuré relativement à angle1.
Pour dessiner un cercle entier, il faut : largeur = hauteur et angle1 = 0 et angle2 = 23040.
XFillArc(display, win, gc, x, y, largeur, hauteur, angle1, angle2)
dessine un arc de cercle plein.
XClearWindow(display, win)
Efface le contenu de la fenêtre en repeigant de la couleur de fond.
Toutes ces fonctions, sauf XClearWindow, peuvelnt s'appliquer à un pixmap pix au lieu de la fenêtre win.

Compilation et Exécution :

Problème de rafraichissement :

Utilisez la technique du "double buffering" avec un pixmap : plot2.c ou dessin2.c

Si vous voulez en savoir plus .....

didier Ferment
didier.Ferment@u-picardie.fr
dernière modification le 29 Février 2000

 

Retour à ma homepage
Retour à la page d'accueil de l'Université de Picardie Jules Verne