Pour réaliser un menu déroulant du meilleur
effet (!), nous nous proposons d'utiliser un champs texte
dont nous modifierons le contenu via Lingo.
Notre travail commence avec la création d'un champs
texte sur la scène. Rappelons que ceci peut-être
fait directement à l'aide de l'outil champs placé
dans la palette des outils au coté des formes. Ce
champs contiendra le texte intitulé de notre menu
soit "Édition".
Nous souhaitons améliorer l'aspect de ce champs,
il nous est possible sans passer par Lingo, de modifier
sa couleur de fond. Le texte doit impérativement
être sélectionné, comme si l'on changeait
SA couleur, afin que nous puissions effectuer notre choix
en pressant sur le deuxième carré échantillon
dans la palette des outils. Ceci étant fait, on aurait
tord de croire que les champs texte de Director n'admettent
pas d'autre enrichissement. Seulement maintenant il faut
utiliser Lingo :
On ouvre la fenêtre message afin d'y saisir les commandes
que l'on veut voir exécuter immédiatement.
Ici pour améliorer l'ordinaire du men, nous modifier
plusieurs propriétés des champs.
set the dropshadow of member "monchamps" to 1
cette propriété permet d'attacher une ombre
au texte d'un acteur champs dont le décalage est
en l'occurrence de 1 pixel. Ce ne peut être utile
que si le texte est de couleur claire. Plus utile est la
commande suivante ;
set the boxdropshadow of member "monchamps" to 2
Ici c'est le champs lui-même qui se voit doté
d'une ombre orientée vers le bas et la droite. Enfin
si l'on veut que le champs soit délimité par
une bordure :
set the border of member 2 to 1
Nous pouvons nous préoccuper maintenant de programmer
l'apparition du menu.
Nous avons un premier besoin : Quand l'utilisateur
presse sur l'intitulé d'un menu déroulant,
il fait apparaître son contenu. Nous attachons au
champs sur la scène le script suivant qui d'abord
modifie son contenu à la volée.
on mouseDown
set X to " Édition" & return & " Copier"
& return & " Couper" & return & " Coller"
& return & " Effacer" & return & " Tout
sélectionner"
put X into field 1
end
on mouseUp
put " Édition" into field 1
end
En l'état, si on lance l'animation notre script
permet déjà de tester cette utilisation particulière
des champs pour créer un menu. Rien pourtant ne se
passe quand l'utilisateur glisse à l'intérieur
du menu pour faire un choix. Nous reprenons donc le premier
gestionnaire (on mouseDown) :
on mouseDown
set X to " Édition" & return & " Copier"
& return & " Couper" & return & " Coller"
& return & " Effacer" & return & " Tout
sélectionner"
put X into field 1
-- Nous devons tout le temps que la souris est enfoncée
-- noter le choix de l'utilisateur et s'il est changé,
mettre
-- la commande du menu (i.e. la ligne du champs) en
-- surbrillance.
-- on crée deux variables chargé de noter
les choix :
set CHOIXPRECEDENT to 0
set CHOIXACTUEL to 0
-- tant que la souris est enfoncée
repeat while the stilldown
if the mousecast = 1 then
-- mais enfoncée au dessus du champs (acteur
1 ici) :
set CHOIXACTUEL to the mouseline
else
set CHOIXACTUEL to 0
end if
-- la variable CHOIXACTUEL stocke donc la position
-- changeante de la souris
-- Nous souhaitons mettre en surbrillance la ligne
-- correspondante du champs
-- mais ceci ne doit être fait qu'à chaque
changement
-- de position à l'intérieur du menu !
-- donc
-- si la position est nouvelle
if CHOIXACTUEL <> CHOIXPRECEDENT then
-- et si on est dans le menu !
if CHOIXACTUEL > 0 then
hilite line CHOIXACTUEL of field 1
end if
-- on prend acte du changement de position
-- pour la prochain fois
set CHOIXPRECEDENT to CHOIXACTUEL
end if
end repeat
end
on mouseUp
put " Édition" into field 1
end
Annexe
Comment peut-on redimensionner un champs via Lingo ?
Impossible ? On le dit mais essayez plutôt ceci :
set the rect of member 1 to rect( getat(the rect of member
1, 1), getat(the rect of member 1, 2), getat(the rect of
member 1, 3) + 20, getat(the rect of member 1, 4) )
Quand il est question d'un champs, seule la troisième
valeur de la propriété the rect of member
peut être modifiée.
Une formulation plus élégante de la même
solution ?
set the rect of member 1 to (the rect of member 1) + rect(0,0,20,0)