Obligement - L'Amiga au maximum

Jeudi 28 mars 2024 - 19:35  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : C - Intuition et les gadgets
(Article écrit par Batchman et extrait d'A-News (Amiga News) - novembre 1988)


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 booléens.
  • Les proportionnels.
  • Et les gadgets de type chaîne ou de type entier.
Un gadget booléen peut être assimilé à bouton ou un interrupteur puisqu'il ne peut prendre que deux états. Il définit une zone rectangulaire d'une fenêtre ("select zone") qui sera sélectionnée ou non lorsque l'utilisateur cliquera dedans avec le bouton de gauche de la souris. Voyons la structure d'un gadget :

C
C

Les gadgets ne peuvent être placés que dans une fenêtre ou une boîte de requête (dans cette version d'Intuition, il ne l'eut pas y en avoir dans un écran mais cette possibilité est réservée pour l'avenir). Ils forment une liste chaînée pour une fenêtre donnée ; c'est-à-dire que, le champ "First-Gadget" de la structure "Window" doit contenir l'adresse de la première structure "Gadget" de la liste. Ensuite, chaque gadget contient dans son champ "NextGadget" l'adresse du gadget suivant. Ce champ contient "NULL" pour le dernier gadget de la liste. Notez bien que, s'il y a plusieurs fenêtres, chacune est associée à la liste contenant ses propres 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 :
  • Pour un gadget booléen, le champ "Gadget-Type" doit contenir le drapeau (flag) "BOOLGADGET". Si le gadget appartient à une boîte de requête, il faut aussi mettre le drapeau "REQGADGET" (on écrit alors : BOOLGADGET|REQGADGET). Si la fenêtre est d'un type particulier appelé "Gimmezerozero", il faut ajouter le drapeau "GZZGADGET".
  • "MutualExclude" n'est pas utilisé sur cette version d'intuition.
  • "SpecialInfo" n'est pas utilisé pour un gadget booléen.
  • "GadgetID" et "UserData" sont réservés à votre usage personnel (nous verrons plus tard comment les utiliser intelligemment).
Les champs

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 :
  • "NULL" signifie que ce gadget est invisible quand il n'est pas activé (rien ne le distingue du fond de l'image, indépendamment du texte que vous pouvez avoir écrit dans la select zone).
  • L'adresse d'une structure "Border".
  • L'adresse d'une structure "Image".
Intuition sait qu'il doit dessiner une image ou une bordure suivant que le drapeau "GADGIMAGE" est ou non placé dans le champ "FLAGS" (nous y reviendrons plus loin en détail).

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.

C

LeftEdge et TopEdge définissent le point de départ du cadre relativement à l'origine du gadget. Par conséquent, suivant la forme que vous souhaitez donner à votre bordure, ces valeurs peuvent très bien être négatives.

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" :

C

(notez que "BordureData" étant un tableau, son adresse est donnée par son nom : il n'y a pas besoin d'écrire "&BordureData")

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".

C

De la même façon que pour une bordure, les deux valeurs "LeftEdge" et "TopEdge" représentent les coordonnées du coin haut gauche de l'image relativement à l'origine du gadget.

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 :

C

FrontPen est le numéro du registre de couleur utilisé pour écrire le texte ; "BackPen" est la couleur utilisée pour le fond du texte si le mode "JAM2" est sélectionné.

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.

C
C


[Retour en haut] / [Retour aux articles] [Article suivant]