01/09/2015

Grafx

J'ai souvent besoin de programmer une fenêtre Xwindow sans bouton, ni trompette, pour y dessiner quelque chose et éventuellement y écrire un texte simple. Les librairies usines à gaz (Gtk, Qt, Fltk, ...) nécessitent un investissement très long, et une mise en place pénible.

GrafX (prononce graf ix, comme X11) est une classe qui manipule X11 directement. Son utilisation est immédiate : open pour ouvrir une fenêtre, line pour tracer un trait, etc.

Exemple simple

copie d'écran de la fenêtre GrafX

Résultat souhaité.

  1. On ouvre une fenêtre GrafX (X11 en fait)
  2. On y trace des lignes, un rectangle et on y affiche un petit texte.
  3. Le programme attend qu'on appuie sur 'q' puis s'arrête.

Ci-contre une copie d'écran.

Le source c++ est disponible ici :

testGrafX.cpp

Les fichiers source de la librairie sont ici :

grafX.h

grafX.cpp

On compile testGrafX.cpp avec :

$ g++ testGrafX.cpp grafX.cpp -o testGrafX -lX11 -std=c++11 -Wfatal-errors

Le source du programme

/*
Simple X11 xwindow class
file : testGrafX.cpp
Neads Xlib.h : # apt install libx11-dev
compile: 
g++ testGrafX.cpp grafX.cpp -o testGrafX -lX11 -std=c++11 -Wfatal-errors
Source: http://www.nd.edu/~dthain/courses/cse20211/fall2011/gfx
20/09/2015
*/
#include "grafX.h"
using namespace std;
//:main ================================================================
int main()
{
	cout << "\n" << PROJECT << VERSION << AUTHOR << "- GNU GPL.\n";
	GrafX g; // instance de la classe GrafX
	g.open(240, 150, "Grafx"); // crée une fenêtre(width, height, title)
	g.color(0, 255, 200); // couleur de tracé
	g.rectangle(10, 50, 160, 60); // trace un rectangle(x, y, w, h)
	g.line(10, 50, 85, 10); // pente du toit
	g.lineto(170, 50); // l'autre pente
	g.line(20, 100, 120, 100); // sol
	for(int step = 0; step < 4; step++) { // marches
		g.lineto(120 + 30*step, 100 + 18*step);
		g.lineto(150 + 30*step, 100 + 18*step);
	}
	// conversion de const string en cstring sous peine de warning 
	char text[] = "Attention à la marche !";
	g.color(255, 0, 0); // change la couleur du crayon
	g.text(20, 90, text); // ecrit un texte 
	while(true) { // attend qu'on appuie sur 'q'
		char c = g.wait();
		if(c == 'q') break;
	}				// il n'est pas besoin de tortiller du cul
	return 0; 	// pour chier droit
}

Les méthodes membres sont visibles et commentées dans grafX.h.

Dans notre cas :

Une fois créée un instance de GrafX : GrafX gx

Créer une fenêtre
gx.open(400, 300, "Graphiques X11")
400 est la largeur.
300 est la hauteur.
"Graphiques X11" est le titre de la fenêtre.
Tracer un rectangle
gx.rectangle(40, 30, 120, 80)
(40, 30) sont les coordonnées du coin supérieur gauche.
120 est la largeur, et 80 est la hauteur.
Tracer un segment de droite
gx.line(100, 60, 140, 60)
(100, 60) sont les coordonnées du premier sommet.
(140, 60) sont les coordonnées du deuxième sommet.
Tracer un segment dont le premier sommet est le sommet précédent
lineto(160, 80)
Le premier sommet est donc (140, 60)
Le second sommet sera (160, 80).
Écrire un texte
texte(60, 40, "Voilà tou !")
(60, 40) est le sommet supérieur gauche du texte : ici le haut gauche du V
"Voilà tout !" le texte.
Remarque

Les fonctions de libX11 sont écrites en C. Les textes sont donc des char *. Mais C++ considère une constante chaîne comme une string de la STL et renacle à la convertir en const char *. Il nous gratifie d'un warning. C'est l'explication de mon petit manège de la ligne 27. On peut dissimuler les warnings avec l'option -w sur la ligne de g++.

TODO

Si tu veux en rajouter d'autres, va à la Documentation de X11.

Pas trop pour rester conforme à More is less.

P.S.

Cet article commence à être vieux. Maintenant je ne programme plus qu'en C. Et pour les dessins j'utilise la librairie GD, cf Librairie graphique GD.

Aller au début




Réalisé avec Qlam - LGPL