01/09/2015
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.
Résultat souhaité.
Ci-contre une copie d'écran.
Le source c++ est disponible ici :
Les fichiers source de la librairie sont ici :
On compile testGrafX.cpp
avec :
$ g++ testGrafX.cpp grafX.cpp -o testGrafX -lX11 -std=c++11 -Wfatal-errors
/*
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
gx.open(400, 300, "Graphiques X11")
gx.rectangle(40, 30, 120, 80)
gx.line(100, 60, 140, 60)
lineto(160, 80)
texte(60, 40, "Voilà tou !")
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++
.
Si tu veux en rajouter d'autres, va à la Documentation de X11.
Pas trop pour rester conforme à More is less.
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.