GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Cartes Pokémon : la prochaine extension Pokémon sera EV6.5 Fable ...
Voir le deal

Le GEM - Partie 1 : l'AES

GFA :: TUTOS :: Confirmés

Aller en bas

Le GEM - Partie 1 : l'AES Empty Le GEM - Partie 1 : l'AES

Message par Shadow272 Ven 20 Nov - 10:24

Le GEM - Partie 1 : l'AES
Par Lafleche

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.

Shadow272 :
Bien fait ce tuto

Lafleche :
Content que cela puisse aider
Shadow272
Shadow272
Admin

Messages : 329
Date d'inscription : 28/12/2017
Age : 65
Localisation : Hainaut Belgique

http://toutatari.blog4ever.xyz/

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

GFA :: TUTOS :: Confirmés

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum