Suivez-nous sur X
|
|
|
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
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - Requêtes
(Article écrit par Max et extrait d'Amiga News Tech - juillet 1989)
|
|
Pour autant que je me rappelle, nous avons vu jusqu'ici comment mettre en place et gérer les
écrans, les fenêtres et les
menus. Ce qui n'est déjà pas mal du tout et devrait permettre la réalisation de petits
programmes, aussi sympathiques que conviviaux. Il nous reste pourtant encore quelques petites choses à
voir pour compléter notre étude de l'environnement Intuition, je pense plus particulièrement aux requêtes.
Requêtes
Vous connaissez tous les "requesters" (fenêtres de requête) : sur d'autres machines, que je ne nommerai
pas pour ne pas leur faire de tort, on les nomme Dialog Box, soit dans la langue de Molière, boîte de dialogue.
Il s'agit de fenêtres particulières, dans lesquelles le programme attend une entrée de la part de l'utilisateur,
entrée qui peut aussi bien être textuelle que proportionnelle. Le programme "Préférences" par exemple, n'est
qu'une immense fenêtre de requête à lui tout seul.
Comment pouvons-nous programmer nous-même de telles requêtes ? Encore une fois, Intuition est la réponse à
notre problème, puisqu'il nous offre la fonction AutoRequest (décalage -348), qui permet l'affichage et la
gestion automatique des requêtes. Il existe d'autres fonctions telles InitRequester, Request ou encore
EndRequest dont on pourrait également se servir, mais - pour une fois en informatique, c'est un exploit ! - pourquoi
faire compliqué quand on peut faire simple ?
Cette fonction, AutoRequest, attend en paramètre dans a0, le pointeur sur la structure Window
de la fenêtre de notre requête (celui que nous avions sauvegardé juste après l'ouverture de la fenêtre
dans WinHandle), dans a1, un pointeur sur la structure IntuiText du message qui doit figurer dans
la requête, dans a2 et a3 les deux pointeurs sur les structures IntuiText des deux boutons possibles,
dans d0 et d1 les drapeaux IDCMP de ces deux boutons, et pour terminer, dans d2 et d3 les largeur et
hauteur totales de la requête.
La structure IntuiText, nous l'avons déjà rencontrée le mois dernier lors de l'étude d'une
structure Menu. La voici tout de même encore détaillée,
par mesure de sécurité :
Décalage |
Signification |
0 |
Detail Pen |
1 |
Block Pen |
2 |
Write Mode |
4 |
Position X |
6 |
Position Y |
10 |
Police à utiliser |
14 |
Pointeur sur le texte |
18 |
Pointeur sur le prochain texte |
Les Detail et Block Pen, vous les connaissez, on les a déjà rencontrés assez souvent ; notez
simplement que dans le cas d'un IntuiText, le Block n'est pas pris en compte. WriteMode ne peut,
à ma connaissance, prendre qu'une seule valeur intéressante (en dehors de la valeur nulle, bien sûr) : 4,
qui indique que le texte devra être écrit en vidéo inverse. Suit donc un octet de remplissage, afin
de garantir la parité de ce qui suit. Position X et Position Y portent bien leur nom, sont exprimées
en pixels et par rapport au coin supérieur gauche de la boîte contenant le texte. Le pointeur sur la
police à utiliser est du même type que ceux rencontrés dans les structures NewScreen et NewWindow
et doit donc être nul, si l'on désire la police standard. Finalement, on
trouve un pointeur sur la chaîne à afficher (au format C, c'est-à-dire terminée par un octet nul),
ainsi qu'un pointeur sur le prochain texte (doit être nul si c'est le dernier).
Cela suffit amplement pour demander à Intuition de bâtir notre requête. Ce que nous allons bien entendu
nous empresser de faire :
Et que se passera-t-il donc lorsque Intuition nous rendra la main ? Eh bien tout simplement, le registre
d0 contiendra le numéro du bouton qui a été choisi (0 pour le droit et 1 pour le gauche). C'est tout.
Peut mieux faire
Certes, c'était bien beau, mais je parlais tout à l'heure de Préférences et, si ma mémoire est bonne, on y
trouve beaucoup plus qu'un message et deux boutons : entrées de textes, réglage des couleurs par déplacement
de potentiomètres, etc. il serait intéressant que nous puissions, nous aussi, utiliser de tels gadgets...
Pas de panique, réponds-je, on y arrive.
Nous avons déjà vu la notion de gadgets lors des descriptions des structures
NewScreen et NewWindow. Mais il
ne s'agissait jusqu'à présent que de gadgets propres au système, comme la barre de déplacement d'une fenêtre,
les boutons de fermeture ou d'empilement. Il nous est heureusement tout à fait possible, moyennant quelques
petits efforts il est vrai, de créer nos propres gadgets. Intuition, qui décidément n'est pas avare pour
deux sous, offre à ce sujet toute une foule de possibilités.
Il convient toutefois de distinguer quatre types de gadgets :
- Les booléens, qui ne peuvent prendre que deux valeurs (Oui et Non, plus généralement Allumé
et Éteint).
- Les chaînes, qui servent à entrer... des chaînes de caractères, oui.
- Les numériques, qui servent à entrer... des nombres.
- Et finalement les "proportionnels", c'est-à-dire ceux que l'on déplace à la
souris pour fixer une valeur (taux de RVB dans une couleur, ascenseur des fenêtres, etc.).
Comme chaque élément d'Intuition, un gadget est décrit par une structure. Dans le cas présent, cette
structure comporte 15 entrées et son pointeur est placé dans la structure de fenêtre, dans laquelle le
gadget devra apparaître. Voici donc le détail d'une structure Gadget :
Décalage |
Signification |
0 |
Prochain Gadget |
4 |
Position X |
6 |
Position Y |
8 |
Largeur de la HitBox |
10 |
Hauteur de la HitBox |
12 |
Gadget Flags |
14 |
Activation Drapeaux |
16 |
Gadget Type |
18 |
Gadget Image |
22 |
Gadget Select |
26 |
Gadget Text |
30 |
Exclude |
34 |
Special Info |
38 |
ID |
40 |
UserData |
Le premier mot long de cette structure pointe sur le prochain gadget à afficher dans la même fenêtre. S'il
n'y en a pas d'autre, il faut le mettre à 0. On trouve ensuite, comme c'est devenu une habitude, les
coordonnées en X et en Y du gadget, sachant qu'elles peuvent être exprimées de plusieurs manières
différentes (absolues ou relatives). Viennent ensuite la largeur et la hauteur de ce que l'on appelle
la "HitBox", c'est-à-dire le rectangle de validité du gadget. Il n'en est effet pas obligatoire du tout
que notre gadget entier soit sélectionnable, seule sera prise en compte la partie du gadget incluse dans
la "HitBox".
Le prochain mot mérite un paragraphe à lui tout seul ; il définit certains paramètres de notre gadget.
Les différents bits fixent ses propriétés. Les deux premiers bits (0 et 1) forment une valeur comprise
entre 0 et 3, qui décide de ce qui doit advenir du gadget lorsqu'il est sélectionné :
Valeur |
Action |
0 |
Gadget inversé |
1 |
Gadget encadré |
2 |
Changement d'image |
3 |
Rien ne se passe |
Le bit 2, s'il est mis, indique que le gadget est composé d'une image. Le bit 3 détermine si la position du
gadget, celle donnée dans sa structure, se réfère au bord supérieur ou au bord inférieur de la fenêtre.
"0" indique le bord supérieur, "1" le bord inférieur. Le bit 4 joue le même rôle que le précédent, mais
en ce qui concerne les bords droite et gauche de la fenêtre. Le bit 5 joue, lui aussi, le même rôle, mais
concernant cette fois-ci la largeur de la "HitBox". Idem le bit 6, mais pour la hauteur de la "HitBox".
Le bit 7, s'il est mis, a pour effet d'activer le gadget dès l'ouverture de la fenêtre, dans laquelle il se
trouve. Le bit 8 détermine enfin, si le gadget peut ou non être sélectionné.
Continuons notre étude la structure Gadget. Nous trouvons encore un mot de drapeaux, méritant lui aussi un
paragraphe particulier. Il s'agit de l'Activation Flags, dont, encore une fois, chaque bit a une signification
particulière.
Bit n° |
Valeur |
Nom |
0 |
1 |
RELVERIFY |
1 |
2 |
GADGIMMEDIATE |
2 |
4 |
ENDGADGET |
3 |
8 |
FOLLOWMOUSE |
4 |
$10 |
RIGHTBORDER |
5 |
$20 |
LEFTBORDER |
6 |
$40 |
TOPBORDER |
7 |
$80 |
BOTTOMBORDER |
8 |
$100 |
TOGGLESELECT |
9 |
$200 |
STRINGCENTER |
10 |
$400 |
STRINGRIGHT |
11 |
$800 |
LONGINT |
12 |
$1000 |
ALTKEYMAP |
RELVERIFY et GADGETIMMEDIATE ont une signification opposée : si RELVERIFY est mis, le gadget ne sera réellement
sélectionné que lorsque le bouton gauche de la souris aura été relâché ; si, au contraire, GADGETIMMEDIATE est mis,
le gadget sera activé dès le clic de la souris, sans attendre le relâchement du bouton. ENDGADGET permet s'il est mis,
que la sélection du gadget provoque la fermeture automatique de la requête
dans laquelle il se trouve. Ceci est très pratique pour les boutons du style "Confirmer" ou "Annuler".
FOLLOWMOUSE fait en sorte qu'Intuition communiquera en permanence au programme les coordonnées de la souris, à partir
du moment où le gadget sera activé, et ce, jusqu'à ce qu'il soit désactivé. Cela permet, en corrigeant au fur et
à mesure la position du gadget, de le déplacer avec la souris. Les BORDER ont pour effet d'adapter la taille du
gadget au Border en cours. Nous y reviendrons lors de l'étude des Borders. TOGGLESELECT inverse l'état de gadget
lors de chaque clic ; de ON, il devient OFF et vice-versa.
STRINGCENTER et STRINGRIGHT indiquent, dans le cas d'un gadget de chaîne, si celle-ci doit être centrée ou justifiée à
droite. Par défaut (STRINGCENTER et STRINGRIGHT sont à 0), la chaîne est alignée à gauche. LONGINT transforme
l'entrée réalisée dans un gadget de chaîne, en un nombre entier. Et finalement ALTKEYMAP indique si une définition
de clavier particulière (SetMap) doit être utilisée pour les gadgets de chaîne.
Suite au prochain numéro
Bon, ce n'est pas que je m'ennuie, mais il se fait tard et la place devient de plus en plus rare. Désolé
de vous quitter comme ça, en si bon chemin, mais je me vois obligé de remettre au mois prochain la suite
de cette fastidieuse étude de la structure Gadget.
|