Pour créer une fenêtre (et donc un bouton, une zone de
saisie etc.) il existe une autre fonction que nous allons voir dans ce programme.
Nous allons aussi effectuer quelques modifications au programme précèdent pour
centrer la fenêtre au milieu de l’écran, changer la couleur et le style de la
ligne et gérer les modifications de taille de la fenêtre crée.
Nous allons aussi utiliser les structures de données liées à
X11 qui facilite l’écriture de programmes à partit d’exemples en langage C. Ma
description des structures se trouvent dans le fichier descStruct.inc qui sera
intégré dans le programme par la directive .include. Remarque : si vous
voulez utiliser d’autres données de ces structures, il faudra vérifier leur
emplacement car j’ai pu faire des erreurs en les traduisant en formalisme GAS.
En plus des descriptions, il faut aussi réserver de la place
en mémoire pour 2 structures nécessaires à l’appel de fonctions : XSetWindowAttributes
et XGCValues.
Après l’ouverture d’une connexion au serveur et la
récupération des informations par l’intermédiaire des structures Display et
Screen, nous devons préparer les attributs nécessaires à la création de la
fenêtre par XCreateWindow. Pour cela nous alimentons les zones mémoires à
l’aide de la structure XSetWindowAttributes. Puis nous calculons les
déplacements X et Y pour centrer notre fenêtre sur l’écran. Pour une raison que
j’ignore, les valeurs calculées (et vérifiées !!) ne centrent pas la
fenêtre. Ensuite nous créons la fenêtre en lui passant 12 paramètres dont 8 par
push (voir la documentation ou les commentaires pour les explications
détaillées).
Puis nous modifions le nom de la fenêtre par la fonction XSetStandardProperties,
nous ajoutons comme auparavant les instructions de correction de l’erreur de
fermeture et nous créons les contextes graphiques : le premier très simple
et pour le second, nous modifions la couleur la taille et le style de la ligne
qui sera dessinée. Pour cela il nous faut passer la position de ces paramètres
et leur valeur dans la structure XGCValues.
Puis nous utilisons la fonction XSetWindowBackground pour
mettre le fond en gris clair (nous aurions pu passer cette couleur aussi dans
la zone Att_background_pixel des attributs crées avant la fenêtre).
Et hop, nous affichons la fenêtre par XMapWindow et nous
essayons à nouveau de centrer la fenêtre avec les mêmes calculs mais avec la
fonction XMoveWindow et cette fois ci, la fenêtre est bien centrée !!!!!
Puis comme dans le programme précèdent nous affichons le
texte, la ligne et le rectangle, les instructions de ces 2 derniers étant
reportées dans des sous-routines. En ce qui concerne la ligne, nous la
dessinons avec le deuxième contexte graphique ce qui permet de l’avoir en rouge
pointillé et plus large Bravo !!
Dans les autorisations de saisies, nous ajoutons StructureNotifyMask
pour que le gestionnaire d’évènements reçoivent les messages de modifications
de la fenêtre. Dans la boucle qui géré celui-ci nous ajoutons un test pour le
message ConfigureNotify. Si nous recevons ce message, nous comparons la valeur
de la hauteur reçue (XConfigureEvent_height) avec la hauteur de la fenêtre en
mémoire et si elles sont différentes nous redessinons la ligne et le rectangle
(et on pourrait ajouter le texte). Il faut aussi penser à enregistrer la
nouvelle hauteur en mémoire. Nous effectuons la même opération pour la largeur.
Ici nous nous sommes contentés de redessiner les figures mais dans d’autres cas
il faudrait adapter le dessin en calculant un facteur de réduction ou
d’agrandissement de chaque figure avant de les redessiner.
Vous remarquerez que toutes les valeurs immédiates ont été
remplacées par les valeurs des zones de chaque structure d’évènements.
Exercice : changer la couleur (par exemple bleue) du
texte
Chercher
dans la documentation les autres attributs possibles des lignes et rectangles
et tester ces attributs.
Sur un
clic du bouton de la souris, afficher le texte « Clic » à l’endroit
du clic de la souris.
Aucun commentaire:
Enregistrer un commentaire