LE GEM EN GFA Basic

 

Premiere PARTIE : L’AES

Pour programmer le GEM nous allons devoir maîtriser deux systèmes dont vous avez sûrement

déjà entendu parler : L'AES et le VDI.

L'AES est la couche chargée de la gestion des fenêtres, leur affichage mais aussi leur réponse aux

évènements.

Le VDI définit une couche d'abstraction permettant de dessiner des objets graphiques à l'écran

sans tenir compte du hardware chargé de faire le travail, l'avantage est qu'une application

reposant sur des routines VDI génériques pourra fonctionner sur toute la gamme des compatibles Atari TOS.


L'AES

Voyons tout d'abord pour créer une fenêtre simple avec un titre.

La première chose à déterminer est l'espace de travail dont nous disposons avant de pouvoir déterminer les dimensions de notre fenêtre.

La première fonction AES étudiée s'appelle wind_get, qui permet d'obtenir tout un tas d'information sur une fenêtre donnée.

sa syntaxe est :


WORD wind_get(handle, mode, parm1, parm2, parm3, parm4)


"handle" désigne le descripteur de la fenêtre dont nous souhaitons obtenir des informations (nous

y reviendrons), "mode" désigne le type d'infos qui nous intéresse, et "parm1" à 4 les paramètres

à passer en fonction du "mode" choisi.

Ici nous allons utiliser le descripteur (handle) 0 qui correspond au bureau, autrement dit pour AES

à la fenêtre "racine".

Nous allons demander le mode 4 (WF_WORKXYWH) qui va initialiser les paramètres passés aux valeurs : position en X, position en Y, largeur, et hauteur de la fenêtre demandée.

Bref, nous allons surtout nous intéresser aux deux dernières valeurs qui vont tout simplement nous

indiquer la taille du bureau !

Ainsi, les tailles des objets graphiques de nos programmes seront adaptés à l'exécution sous Aranym, certes, mais également sur un humble ST, et ce quelle que soit la résolution de l'écran ...

Précision qui s'appliquera à chacune des fonctions étudiées : bien entendu il se peut que pour diverses raisons quelque chose se passe mal (loi de Murphy), il faut donc bien entendu tester le retour de cette fonction, une valeur de retour de 0 indiquant une erreur.


ret%= WIND_GET(0,4,rootx%,rooty%,rootw%,rooth%)

IF ret%=0

  ALERT 3,"Erreur AES",0,"oops",but%

  STOP

ENDIF


Je partirai du principe que vous êtes des programmeurs sérieux et que vous contrôlerez vos

valeurs de retour, n'est ce pas ?


C'est bien joli tout ça, mais je ne sais pas si vous avez vu, mais votre bureau ne se limite pas

à un bête fond coloré, vous avez notamment un menu en haut, et il prend quelques pixels à

l'espace théoriquement disponible.

Aussi nous avons un autre appel AES qui va permettre de calculer la VRAIE surface disponible,

il s'agit de la fonction bien nommée wind_calc :

ret%=WIND_CALC(1,&H2F,rootx%,rooty%,rootw%,rooth%,workx%,worky%,workw%,workh%)


En gros on dit : Pour la fenêtre se situant aux coordonnées (rootx%,rooty%) et de taille

rootw% x rooth%, je voudrais que tu me calcules la vraie partie exploitable (sans ascenseurs,

sans barre de menu, etc ...) qui se trouvera à (workx%,worky%) de taille workw% x workh%.

Le premier paramètre indique ce que l'on souhaite calculer, à 0 on passe la surface de travail

et l'on récupère la taille totale, à 1 on passe la taille totale de la fenêtre et on récupère

la surface de travail effectivement exploitable.

Pour la seconde valeur, on spécifie par un jeu de masques quels attributs aura cette valeur,

vous pouvez vous référer au compendium atari (dispo sur ce site sur la page Atari) , ou au tableau traduit suivant :


Nom      Masque      Signification

NAME     0x01        A une barre de titre

CLOSER   0x02        A une case de fermeture de fenêtre

FULLER   0x04        A une cas d'agrandissement de fenêtre

MOVER    0x08        Fenêtre déplaçable par l'utilisateur

INFO     0x10        A une barre d'information

SIZER    0x20        A une case de redimenssionement

UPARROW  0x40        A une flèche "haut"

DNARROW  0x80        A une flèche "bas"

VSLIDE   0x100       A un ascenseur vertical

LFARROW  0x200       A une flèche "gauche"

RTARROW  0x400       A une flèche "droite"

HSLIDE   0x800       A un ascenseur horizontal

SMALLER  0x4000      A une case d'iconification


Ainsi notre valeur &H2F signifie : une fenêtre avec une case de redimensionnement, deplaçable,

avec des cases d'agrandissement et de fermeture , et une barre de titre.


En passant la taille du bureau a cette fonction, on calcule donc la taille maximale de notre

fenêtre pour le type défini ci-dessus.


Maintenant que nous avons ces informations, nous pouvons créer la fenêtre, sans l'afficher,

de la façon suivante :

handle%=WIND_CREATE(&H2F,workx%,worky%,workw%,workh%)


Vous aurez remarqué ici que la valeur retournée est différente, nous récupérons le descripteur

de la fenêtre.

Comme son nom l'indique, la variable 'handle' désigne l'identifiant unique de notre fenêtre, et qui

nous servira à la référencer pour toutes les futures opérations la concernant.


Ensuite nous définissons le titre de la fenêtre, notez que cela doit être fait avant de tenter d'afficher la fenêtre :

titre$="Le GEM en GFA"

ret%=WIND_SET(handle%,2,CARD(SWAP(VARPTR(titre$))),CARD(VARPTR(titre$)),0,0)


La fonction wind_set prend, outre le descripteur renvoyé par wind_create, plusieurs arguments

moins compliqués qu'il n'y parait a première lecture :

Le "2" indique que nous souhaitons modifier la caractéristique WF_NAME, autrement dit le

titre de la fenêtre.

Les deux arguments suivants doivent correspondre aux mots (16 bits), respectivement de poids

fort et de poids faible, de l'adresse (32 bits donc) de la chaîne de caractères à utiliser.

On utilise le mot clef VARPTR pour récupérer l'adresse de notre chaîne, puis CARD permet

de ne récupérer que le mot (16 bit) de poids faible de cette adresse.

La fonction SWAP permet quant à elle d'intervertir poids fort et poids faible d'une valeur.

Ainsi CARD(VARPTR(..)) récupère le poids faible de l'adresse, et CARD(SWAP(VARPTR(..))) le

poids fort ...

Cette fonction de wind_set ne réclamant pas plus de 2 paramètres, les paramètres 3 et 4 sont

initialisés à 0.


La récompense :

Maintenant que tout cela est vu, ne reste qu'à afficher enfin notre fenêtre :

ret%=WIND_OPEN(handle%,workx%,worky%,workw%,workh%)


Et enfin à ajouter une boucle attendant que nous la fermions pour libérer le “handle”. Pour cela nous utilisons la fonction EVNT_MESAG() pour intercépter les événements, et nous sortons de la boucle quand l’événement 22 (WND_CLOSE) est détecté :

DO

  a%=EVNT_MESAG(0)

LOOP UNTIL MENU(1)=22


a%=WIND_CLOSE(handle%)

a%=WIND_DELETE(handle%)



Le résultat devrait être une fenêtre, avec une barre de titre, mais sans contenu...

C'est tout à fait normal, ne soyez pas déçu, ce sera le thème du prochain tutorial où nous verrons comment dessiner avec le VDI.

D'ici là, bonnes expérimentations avec le GFA !