jeudi 14 juin 2018

Chapitre 34 : Création d’une fenêtre avec la fonction XCreateWindow


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