|
|||||||||||||||||||||||||||||||||||||||||||
|
Le Chorizo Kid ayant récemment disjoncté, c'est Batchman, héros sans peur, qui reprend gaillardement la barre de notre galère. Totalement incapable de s'abaisser au niveau du non initié, Batchman a décidé de vous entretenir de sujets autrement plus préoccupants que les habituels délires du Kid. Intuition et les gadgets Quand vous manipulez une fenêtre, vous changez sa taille, vous la faites passer devant ou derrière les autres, vous la fermez, vous manipulez un gadget. Traiter une action sur un gadget ne revient pas à déterminer la position de la souris lorsque l'on clique sur un de ses boutons - en tout cas, pas pour vous, programmeurs - le système d'exploitation s'en occupe : ici, il s'agit d'Intuition. Le système Intuition interne à l'Amiga permet de faciliter énormément le traitement de ces objets mais il comporte de nombreuses possibilités et finesses... Le manuel dédié à Intuition est assez complet mais, d'une part il laisse tout de même quelques points dans l'ombre et d'autre part, seuls les développeurs ont la chance d'y accéder. Quant aux exemples des livres ou des publications (autres qu'A-News bien sûr), ils n'abordent que les points les plus simples en évitant soigneusement les points délicats. Je souhaite que cet article vous permette d'inclure des gadgets dans vos propres créations. Un menu dirigé par des gadgets et utilisé à la souris est tellement plus agréable et rapide d'emploi (plus simple aussi) qu'une commande tapée au clavier. Les possibilités des gadgets sont immenses et, mon but étant de les étudier à fond, nous nous limiterons pour commencer à un petit domaine - mais le plus important - les gadgets booléens. Gadgets Il existe avant tout quatre sortes de gadgets :
Les champs "LeftEdge" et "TopEdge" définissent les coordonnées du coin haut gauche du gadget par rapport à l'origine de la fenêtre. Ces coordonnées sont dépendantes de la résolution de l'écran. Les deux autres champs "Width" et "Height" définissent respectivement la largeur et la hauteur du gadget : plus exactement de la "select box", la zone dans laquelle Intuition détectera que l'on a touché au gadget (un clic). Réglons tout de suite les détails :
Voyons maintenant les champs importants : 1. GadgetRender Ce pointeur contient l'adresse de la structure décrivant l'imagerie du gadget lorsqu'il n'est pas sélectionné. Trois possibilités s'offrent à vous :
Nous allons étudier les deux dernières possibilités en commençant par la structure "Border". Cette structure permet de tracer un cadre autour du gadget quand celui-ci est créé ou rafraîchi, sans aucune intervention de votre part. FrontPen est le numéro du registre de couleur utilisé pour tracer la bordure ; "BackPen" n'est pas utilisé. DrawMode : deux modes de dessin sont possibles. "JAM1" utilise "FrontPen" pour dessiner la bordure alors que "XOR" complémente le fond de l'image sur le tracé de la ligne. Count est le nombre de points qui constituent la bordure. XY est l'adresse du tableau contenant les couples de coordonnées des points constituant la bordure. NextBorder est un pointeur sur une autre structure "Border" pour dessiner éventuellement un autre cadre. S'il n'y en a pas d'autre, il contient "NULL". Voici un exemple de structure "Border" : Si vous placez dans "GadgetRender" l'adresse d'une structure "Image", de la même façon que pour une bordure, Intuition se chargera des dessins quand vous créerez ou rafraîchirez le gadget ou aussi quand il reviendra à l'état "au repos". Width et Height sont les dimensions de l'image dépendantes bien entendu de la résolution de l'écran. Depth est la profondeur de l'image, c'est-à-dire le nombre de plans de bits qu'elle affecte. Elle peut aller de 1 à 5 mais elle est limitée par la profondeur de votre écran. Pour simplifier, je vous conseille de la fixer au même niveau que celle de l'écran. On peut faire des images de profondeur inférieure à celle de l'écran qui utiliseraient moins de mémoire mais c'est plus délicat à mettre en oeuvre et il faudrait au moins un article entier pour traiter de ce problème. ImageData est l'adresse du tableau contenant les données de l'image. PlanePick est un bitmap des registres de couleurs utilisés. Si vous avez suivi mon précédent conseil, utilisez-les tous en affectant 0xFF à cette variable. "PlaneOnOff" indique à Intuition ce qu'il faut faire des plans de bits non utilisés. Dans ce cas particulier, fixez-la à 0x00. NextImage est un pointeur sur une autre image à dessiner éventuellement ; sinon, il doit contenir "NULL". 2. SelectRender Ce champ définit l'imagerie du gadget activé de la même façon que pour "GadgetRender" et avec la même structure de données : si le gadget au repos a une bordure, dans l'état activé, il peut en avoir une différente mais pas une image. Notez aussi que dans le cas où ce champ pointe sur une structure Image, le drapeau "GADGHIMAGE" doit être présent dans le champ "FLAGS" afin qu'Intuition sache qu'il doit dessiner une image quand le gadget change d'état. 3. GadgetText Ce pointeur contient "NULL" si vous ne souhaitez pas faire figurer de texte dans votre gadget. Dans le cas contraire, il contiendra l'adresse d'une structure "IntuiText" définie ci-dessous : DrawMode peut ici prendre trois valeurs : "JAM1", "JAM2" et "XOR". JAM1 signifie que le texte est écrit par-dessus le fond de l'image ; "JAM2" précise que le fond doit être effacé avant que le texte ne soit écrit. Enfin, le mode "XOR" écrit le texte en complémentant la couleur du fond. LeftEdge et TopEdge définissent comme d'habitude l'origine du texte relativement à celle du gadget. TextAttr est un pointeur sur une structure du même nom (que je laisse de côté pour le moment ; ça n'est pas notre sujet) si vous voulez écrire dans un jeu de caractères particulier. Pour avoir la police de caractères standard, affectez la valeur "NULL" à ce champ. IText est un pointeur sur la chaîne de caractères à afficher. Je vous rappelle (pour ceux qui n'ont pas l'habitude du C) que si vous donnez à ce champ la valeur "TOTO" (avec les guillemets), le compilateur réserve de la place pour la chaîne "TOTO\0" et retourne son adresse comme pointeur. Enfin, NextText est un pointeur sur une autre structure "IntuiText" s'il vous reste du texte à écrire. Sinon, il contient "NULL". 4. FLAGS Ce champ indique à Intuition les propriétés du gadget. La première est la manifestation de la sélection que l'on appelle le "highlighting" : si le drapeau "GADGHNONE" est placé, le gadget ne changera pas d'état lorsque l'on cliquera dessus. Si le drapeau "GADGHBOX" est mis, le gadget sera entouré d'une boîte tant qu'il sera sélectionné. Si l'on place le drapeau "GADGHCOMP", l'intérieur du gadget sera complémenté ; c'est-à-dire qu'il changera de couleur. Toutefois, la complémentation ne se fait pas au niveau de la couleur proprement dite mais au niveau du numéro de registre de couleur utilisé. Par exemple, les points de couleur 0 (00) deviendront de couleur 3 (11) ; ceux de couleur 2 (10) prendront la couleur 1 (01), etc. Le drapeau "GADGHIMAGE" indique à Intuition que la structure "Image" dont l'adresse est dans le champ "SelectRender" doit être dessinée lorsque le gadget est sélectionné. Il est bien évident qu'un seul de ces quatre drapeaux ne peut être choisi à la fois. Le drapeau "GADGIMAGE" (pas "GADGHIMAGE" !) demande à Intuition de dessiner l'image associée à la structure "Image" dont l'adresse se trouve dans le champ "GadgetRender" quand le gadget est "au repos". La combinaison de "GADGIMAGE" et "GADGHIMAGE" permet donc l'alternance de deux images différentes quand l'utilisateur clique sur le gadget (et de réaliser une petite animation, comme pour les icônes) sans que le programmeur n'ait à prévoir un quelconque dessin : c'est Intuition qui dessine la bonne image lorsque le gadget change d'état. Si vous êtes arrivé jusqu'ici, cela veut dire que vous ne vous êtes pas endormi ou que vous n'avez pas changé d'article (je vous remercie de votre attention). Si ce que vous avez lu vous semble quelque peu obscur, suivez en même temps sur le programme d'exemple. Tout est clair ? (je l'espère parce que ça se complique). Le drapeau "GRELBOTTOM" signifie que l'ordonnée du coin haut gauche du gadget est relative non pas à l'origine de la fenêtre mais au bas de celle-ci. En d'autres termes, le gadget est toujours à la même distance du bas de la fenêtre, même si on la redimensionne. C'est par exemple le cas pour le gadget de dimensionnement des fenêtres qui se trouve dans le coin en bas à droite. Notez bien que l'ordonnée (Y) étant relative au bas de la fenêtre, elle doit être négative pour que le gadget apparaisse. Le drapeau "GRELRIGHT" utilise le même principe sauf qu'ici, c'est l'abscisse (X) de l'origine du gadget qui est relative au côté droit de la fenêtre. Les deux drapeaux "GRELWIDTH" et "GRELHEIGHT" obéissent au même principe : la largeur et la hauteur sont relatives à celles de la fenêtre qui contient le gadget. Par exemple, avec "GRELWIDTH" et une largeur de -20, le gadget sera toujours moins large de 20 pixels que la fenêtre, quelle que soit la taille de celle-ci. Le drapeau "SELECTED" est d'une importance primordiale : c'est sa valeur qui permet de savoir si le gadget est sélectionné ou non. Un gadget en mode "TOGGLESELECT" (on y reviendra) créé avec ce drapeau est dès le départ dans l'état active. Enfin, dernier de cette catégorie, le drapeau "GADGDISABLED" inactive un gadget : tant qu'il se trouve dans cet état, on ne peut plus l'activer et son image est recouverte d'une trame (il apparaît en "fantôme", ou "ghosted" en anglais) pour indiquer clairement qu'il est hors-service. 5. Activation Ces drapeaux conditionnent le comportement du gadget lors d'une action. Nous passerons rapidement sur "ENDGADGET" (qui ne concerne que les gadgets attachés à des requêtes), sur "STRINGCENTER", "STRINGRIGHT", "LONGINT" et "ALTKEYMAP" qui ne concernent que les gadgets de type chaîne ou de type entier. Le drapeau "TOGGLESELECT" rend le gadget comparable à un interrupteur au lieu d'un bouton-poussoir. Sans ce drapeau, le gadget n'est activé que lorsque l'utilisateur clique dessus. Par contre, avec "TOGGLESELECT", le gadget alterne entre les états activé et "au repos" chaque fois que l'utilisateur le manipule. Le drapeau "GADGIMMEDIATE" force le gadget à "prévenir" le programme dès qu'il est activé. Ce drapeau n'est pas obligatoire mais il se révèle indispensable pour un bon fonctionnement (conseil : ne l'oubliez pas). Le drapeau "RELVERIFY" maintient le gadget activé tant que le bouton de la souris n'a pas été relâché et prévient le programme s'il a été relâché correctement : ceci est assez délicat ; nous y reviendrons lorsque nous étudierons les messages. Nous traiterons aussi à ce moment-là de "FOLLOWMOUSE". Il reste quatre drapeaux : "RIGHTBORDER", "LEFTBORDER", "TOPBORDER" et "BOTTOMBORDER" qui permettent de lier la taille et la position du gadget aux dimensions des bordures de la fenêtre. Ces drapeaux ajustent la taille de la bordure en question de la fenêtre à celle d'un gadget inclus dans la même bordure. Mais ceci n'a aucune conséquence visible ; à vrai dire, je me demande toujours quelle est l'utilité... Malgré tout, si votre gadget chevauche plus ou moins la bordure de la fenêtre, vous pouvez vérifier en scrutant la variable "Window->BorderRight" (si vous avez choisi RIGHTBORDER) que la taille de la bordure de droite de cette fenêtre varie bien suivant la position du gadget. Programme exemple Nous en resterons là pour aujourd'hui. Pour mettre en pratique ce que vous venez de lire, tapez donc le programme d'exemple. Il crée trois gadgets qui résument les grandes possibilités de ces objets (cliquez sur tout, changez la taille de la fenêtre pour voir les conséquences, sortez en cliquant pour la fermer). Le mois prochain, nous verrons comment utiliser les gadgets dans un programme.
|