Tutorial #1-2: Affichage d'images BMP et "redraw"





Hop à peine le temps de respirer que je vous propose la suite du 'tutorial' précédent ! Nous avions programmé une zoulie fenètre que l'on pouvait déplacer, iconifier et fermer.

Je vous propose cette fois-ci de charger une image bmp dans notre fenètre, et en profiter pour voir comment l'on peut gérer les 'redraw' !

Voici notre exemple modifié:

' ---> Chargement de bmp et redraw en GFA Windows
'
OPENW #1,_X / 2 - 320,_Y / 2 - 200,640,400,%001110000
TITLEW #1,"SOTB !"
IF EXIST("fond.bmp")
adr& = LOADBMP("fond.bmp")
ENDIF
REPEAT
PEEKEVENT
IF MENU(1) = 21
@redraw
ENDIF
UNTIL MENU(1) = 4
CLOSEW #1
FREEBMP adr&
END
'
PROCEDURE redraw
PUT 0,0,adr&
RETURN


On ouvre la fenètre, on lui donne un titre (j'ai mis "SOTB !" à la place de "Pas Glop !", vous verrez pourquoi plus loin !)

Ensuite nouveauté: chargement de l'image bmp "fond.bmp".
Ici l'image à télécharger (clic droit puis "enregistrer l'image sous...").

L'instruction
IF EXIST est la même que sur ATARI ST: on teste si le fichier existe, si oui l'instruction adr&=LOADBMP("fond.bmp") charge l'image à l'adresse adr&. on n'a pas besoin dans ce cas de réserver de mémoire, le GFW s'en occupe tout seul...

Attention en GFW, adr& représente une variable sur un mot long (32 bits) et adr% sur un mot (16 bits), c'est donc inversé par rapport au GFA !

Dans notre boucle
REPEAT/UNTIL on a ajoûté le test pour le redraw: IF MENU(1)=21

Redraw ? Le redraw (ou redessin) est le rafraîchissement du contenu d'une fenêtre ou d'un formulaire, qui avait été caché par un(e) autre.

En gros, quand notre fenêtre aura été masquée par une autre et qu'elle reviendra en premier plan, il va falloir redessiner son contenu, sinon on aura droit à un rectangle blanc à la place de la partie qui était masquée !

Ben oui ça ne se fera pas tout seul, c'est à nous de le faire ! Heureusement L'instruction
MENU() est là pour nous aider:

MENU(1)=21 - Une section rectangulaire de la fenètre doit être redessinée (WM_PAINT)
MENU(7) - retourne la coordonnée x du coin haut gauche
MENU(8) - retourne la coordonnée y du coin haut gauche
MENU(9) - retourne la largeur du rectangle à redessiner
MENU(10) - retourne la hauteur du rectangle à redessiner

A noter que l'on aurai pu mettre IF WM_PAINT qui correspond à IF MENU(1)=21

S'il y a effectivement besoin d'un redessin d'une partie de la fenêtre, on saute à la PROCEDURE redraw et on réaffiche tout le fond dans la fenêtre à l'aide de la fonction PUT x,y,adr& qui affiche aux coordonnées x et y de la fenètre l'image qui se trouve à l'adresse adr&

Les puristes me diront qu'on ne pourrait redessiner que la partie effacée puisque MENU(7) à MENU(9) nous en donne les coordonnées. C'est vrai, mais nous en resterons là pour le moment.

Quand on quitte le programme (clic sur la croix de fermeture), on n'oublie pas de fermer la fenètre
CLOSEW #1, puis de libérer la zone mémoire ou se trouvait l'image (FREEBMP adr&)

Une fois avoir vu l'image, vous avez peut-être compris pourquoi j'ai changé le titre ? En effet "SOTB" signifie "Shadow Of The Beast".

Voici notre fenêtre après chargement de l'image:


Je vous propose de voir tout au long de ces tutoriaux comment refaire l'intro animée du jeu en GFW !

Dans le prochain chapitre je vous expliquerai comment programmer un écran "logique" en mémoire afin de pouvoir travailler sur plusieurs écrans cachés.