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 : C - Les gadgets proportionnels
(Article écrit par Pascal Amiable et extrait d'Amiga News Tech - juin 1991)
|
|
Après avoir fait connaissance avec les gadgets booléeens et les gadgets de chaînes,
nous allons étudier ce mois-ci les gadgets proportionnels. Et pour illustrer tout cela, je vous propose un programme
de palette pour faire varier les couleurs du Workbench.
Le gadget proportionnel est, à mon avis, l'objet le plus flexible et le plus intuitif pour la saisie de données
numériques, que l'on puisse trouver sur Amiga. Qu'ils soient fonction d'une ou plusieurs variables, ces gadgets
permettent de saisir une valeur discrète comprise entre deux bornes fixées par le programmeur. Par exemple,
dans un programme permettant de changer les couleurs de l'écran, les bornes inférieure et supérieure
sont respectivement 0 et 15, l'intervalle entre deux valeurs (le pas de "déplacement") étant de 1.
Mais l'intérêt d'un tel gadget ne s'arrête pas là, puisqu'il permet également de donner à l'utilisateur
des informations sur la valeur de telle ou telle donnée, ou une proportion de cette donnée par
rapport à une autre. Par exemple, sur mon traitement de texte, au moment où j'écris cet article,
le gadget proportionnel situé sur le côté m'indique en permanence la taille de mon document et
la position du curseur dans celui-ci, et ce de manière beaucoup plus intuitive qu'une série de
chiffres.
Un gadget proportionnel est, pour Intuition, un gadget de type spécial, comme l'était le gadget
de saisie de chaîne de caractères du mois dernier. Nous allons donc associer à la structure gadget
classique une structure spéciale dénommée "PropInfo".
La première chose à faire pour créer ce type de gadget est d'indiquer dans le champ "GadgetType"
le drapeau PROPGADGET.
Ensuite, on indique dans le champ "SpecialInfo" l'adresse de la structure "PropInfo"
associée au gadget. Cette structure "PropInfo" contient les données suivantes :
Voyons maintenant comment sont utilisés les différents champs de cette structure. Nous
prendrons comme exemple le potentiomètre gérant une des couleurs de la palette.
La première chose qu'il faut indiquer à Intuition dans le champ "Flag", c'est de n'autoriser
la variation que suivant la verticale. Pour ce faire on positionne le drapeau
FREEVERT. On positionne également le drapeau AUTOKNOB afin de laisser Intuition gérer la
taille du curseur de déplacement.
Il nous faut maintenant indiquer à Intuition l'incrément du potentiomètre. Il est codé
sur 16 bits, c'est-à-dire que la valeur d'incrément doit être ramenée sur 16 bits.
Pour notre exemple, l'incrément est de 1/16, on précisera donc dans le champ "VertBody"
0xFFFF/16 soit 4096. Comme le déplacement horizontal est interdit, on indiquera -1
dans le champ "HorizBody".
On initialisera le champ "HorizPot" à -1 (déplacement interdit suivant X) et "VertPot"
à la valeur de la couleur, multipliée par 4096 (exemple : si la couleur vaut 2, alors
"VertPot" vaut 2*4096=8192). Le reste des champs de la structure "PropInfo" est géré par
Intuition. On les initialisera à 0 malgré tout.
Gestion des gadgets
Le mois dernier, pour attendre la sélection d'un gadget, nous avons eu recours à une
boucle sans fin de type "while(1)". Cette méthode très simple de gérer les actions a
pour grave inconvénient de faire tourner à vide le programme lorsqu'aucun gadget n'est
sélectionné. Pour éviter cette boucle à vide qui consomme de toute façon du temps processeur,
nous allons simplement utiliser la fonction Wait() d'exec.library, qui met la tâche en
veille jusqu'à ce que l'argument transmis à la fonction passe à 1.
Cet argument est tout simplement le champs fenêtre->UserPort->mp_SigBit, qui vaut 1
lorsqu'une interaction a été effectuée par l'utilisateur, et 0 sinon.
Ainsi on ne consomme plus inutilement du temps processeur.
Une fois qu'un signal a été envoyé à notre programme, il s'agit de déterminer quel
type d'évènement est survenu. S'il s'agit d'un IntuiMessage, on le récupère avec la
fonction GetMsg() et on étudie sa classe (IntuiMessage->Class). Trois cas nous
intéressent alors :
GADGETDOWN : dans ce cas, l'utilisateur a sélectionné un des gadgets, on exécute
donc la fonction qui lui est associée, suivant la méthode décrite le mois dernier.
CLOSEWINDOW : l'utilisateur veut refermer la palette et terminer le programme.
On exécute alors la fonction referme() qui, comme son nom l'indique, clos la fenêtre
et les bibliothèques Intuition et Graphics. On positionne également la variable "fin"
à 1, terminant ainsi l'exécution du programme.
MOUSEBUTTONS : dans ce cas, l'utilisateur a cliqué avec le bouton gauche de la
souris dans la fenêtre. Ce type d'évènement va nous permettre de savoir par une série
de quatre tests, si l'utilisateur a sélectionné une couleur et laquelle, ou s'il a
simplement cliqué au hasard dans la fenêtre. Lors d'une sélection d'une couleur, on
affecte le numéro de couleur à la variable "courant".
Toute autre évènement ne nous intéresse pas, donc on ne fait rien. Comme vous pouvez le voir
tout cela est fort simple.
Dernier point sur la gestion des gadgets proportionnels. Lors de la sélection d'une couleur,
il faut réinitialiser les potentiomètres des gadgets RVB pour tenir compte de chaque valeur
des composantes de couleur. Pour ce faire, on initialise chaque champ "VertPot" des gadgets
avec la valeur de la composante rouge, vert, bleu multipliée par 4096, ce qui revient à
effectuer un décalage de 12 bits ver la gauche comme suit :
Voici décrite la manière dont sont gérés les gadgets. Je vous conseille de vous reporter au
programme d'exemple joint en fin d'article pour de plus amples renseignements.
La gestion des couleurs
Nous allons maintenant étudier comment sont gérés les couleurs par l'Amiga. Chaque écran ouvert
sous Intuition possède sa propre palette de couleurs dont le nombre est lié, je vous le rappelle,
au nombre de plans de bits associés à l'écran. Notre palette sert à modifier les couleurs du Workbench,
qui possède en standard deux plans de bits, donc quatre couleurs. On accède à la table des couleurs par
le ViewPort de l'écran, son adresse se trouvant dans le champ "ColorMap". La première étape consiste
donc à récupérer l'adresse du ViewPort de l'écran à l'aide de la fonction ViewPortAdress :
On récupère ensuite l'adresse de la table des couleurs :
Cette adresse obtenue, on peut modifier les valeurs de la table et ainsi les couleurs de l'écran.
On lit la valeur d'une couleur à l'aide de la fonction GetRGB4() :
Une couleur contient trois composantes rouge, vert et bleu. Sur Amiga, la
couleur complète est codée sur 16 bits (UWORD). Chaque composante se voit associer 4 bits,
soit 12 bits pour les trois. Les 4 bits de poids fort ne sont pas utilisés. Le schéma
ci-dessous synthétise cette organisation.
Avec :
- "xx" représente un bit inutilisé.
- "RR" un bit associé à la composante rouge.
- "VV" un bit associé à la composante verte.
- "BB" un bit associé à la composante bleu.
Pour extraire chaque composante de notre mot couleur, on utilisera les formules suivantes :
Pour initialiser une couleur de la ColorMap, on utilise la fonction SetRGB4() :
A noter qu'il est également possible, comme on peut le voir dans le programme d'exemple, de
charger plusieurs couleurs à la fois dans la ColorMap avec LoadRGB4() :
Les couleurs sont déclarées dans un tableau de mots de 16 bits :
Conclusion
Notre article sur Intuition se termine. Il a certes été plus long que d'habitude, mais un
minimum d'explications etait nécessaire pour ce programme.
|