Envie de participer ?
Bandeau

Dans le tome 2 de ce mémento, qui est une compilation d'exemples pratiques pour apprendre la programmation en Microsoft Office Excel avec VBA, vous allez découvrir la programmation en mode graphique en VBA.

I. Introduction à la programmation graphique en VBA

Dans le tome 1, nous avons étudié les bases de la programmation d'EXCEL en VBA. Mais pourquoi programmer en mode graphique ? Imaginez que vous puissiez maîtriser chacun des pixels de votre écran, afficher des images, gérer des animations… Vous devinez toute la richesse qu'une programmation en mode graphique peut vous apporter.

Autant le savoir dès maintenant, le VBA n'a pas les fonctions nécessaires pour une programmation en mode graphique.

« Les API, Application Programming Interface, sont des ensembles de classes, de méthodes ou de fonctions, mises gratuitement à disposition des développeurs par les éditeurs de services, de logiciels ou d'applications.

Nous allons étudier les bases de la programmation en mode graphique en utilisant les principales API dédiées au mode graphique.

Lire aussi: Guide d'achat : pistolets à eau nouvelle génération

De solides notions de programmation en VBA vous seront nécessaires.

Nous faisons référence dans ce document aux API Windows compatibles avec la version EXCEL 32 bits.

Pour plus d'information sur la compatibilité des API sous EXCEL 64 bits, je vous invite à lire l'excellente documentation de Thierry Gasperment : Développer avec Office 64 bits.

II. Utilisation de l'API GetWindowDC

La première API que nous utiliserons est GetWindowDC qui retourne dans un entier long le « contexte de périphérique » (Device Context) de l'écran.

Pour bien comprendre, représentez-vous l'écran comme étant l'équivalent d'une image (Bitmap) composée de pixels de couleurs différentes.

Lire aussi: Point de Mire Nouvelle Génération : Analyse Complète

Vous remarquerez que les API que nous utiliserons expriment les coordonnées d'un pixel au format (X, Y), contrairement aux fonctions du VBA qui expriment les coordonnées d'une cellule au format (Y, X).

La ligne est tracée avec le style, la taille et la couleur par défaut.

Vous pouvez paramétrer ces valeurs, avec l'API CreatePen(Style, Taille, Couleur), puis sélectionner ce nouveau modèle avec l'API SelectObject(Hdc, Objet).

Le dernier point devenant le nouveau point d'origine, cette technique permet de dessiner un polygone vide, c'est-à-dire sans couleur de fond.

Pour écrire du texte, nous disposons de plusieurs API.

Lire aussi: Notre avis sur l'AKS74u Cyma CM.045 : La réplique airsoft vaut-elle le coup ?

L'API CreateFont permet de définir les 14 paramètres de la police utilisée.

III. Travail avec le contexte de l'écran et l'API BitBlt

Jusqu'à présent nous avons travaillé directement sur l'écran, en utilisant le contexte de l'écran. Mais dans la pratique, il ne faut pas faire comme cela, car les temps de mise à jour de l'écran sont trop longs et provoquent des saccades.

L'exemple suivant permet d'inverser l'écran.

Pour cela, nous mémorisons l'écran dans une première mémoire, puis nous créons une deuxième mémoire, vide, qui sera alimentée des pixels inversés, ceux de gauche allant à droite, ceux d'en haut allant en bas.

Remarques sur l'utilisation de BitBlt (HdcDestination, X, Y, Largeur, Hauteur, HdcSource, XSource, YSource, Mode) : la taille de l'image source à copier est définie dans les arguments Largeur et Hauteur.

Le point d'origine (haut, gauche) de l'image source est défini par les arguments XSource et YSource, qui ne valent pas forcément 0. Vous pouvez donc ne copier qu'une fraction de l'image source.

De même, l'image n'est pas forcément copiée dans le contexte de destination au point 0, 0 (haut, gauche). Vous pouvez donc copier l'image source n'importe où dans le contexte de destination grâce aux arguments X et Y.

En résumé : pour faire une copie d'écran dans une mémoire, HdcSource est le contexte de l'écran et HdcDestination est le contexte de la mémoire.

Il existe une autre API pour copier une image, semblable à BitBlt, un peu plus longue en temps de traitement, mais qui sait gérer la couleur de transparence.

IV. Écriture de texte en transparence

Pour écrire un texte en transparence, nous créons dans un premier temps une mémoire de la taille du texte à écrire.

Cette mémoire, vide, est initialisée avec des pixels à 0.

Puis nous y déposons le texte désiré après avoir pris soin de définir la couleur 0 comme couleur de fond.

V. Chargement d'images avec VBA LoadPicture

La fonction VBA LoadPicture permet de charger une image Bitmap BMP, compatible au format écran.

VI. Transformation des dimensions d'une image avec StretchBlt

L'API StretchBlt(HdcDestination, X, Y, Largeur, Hauteur, HdcSouce, XSource, YSource, LargeurSource, HauteurSource, Mode) permet de transformer les dimensions d'une image.

VII. Première animation : déplacement d'une image à l'écran

Nous avons suffisamment d'outils graphiques pour une première animation, qui consiste à déplacer une image à l'écran.

Reprenons l'image de la pomme que nous venons d'afficher dans l'exemple précédent.

D'après les principes de Newton, cette pomme attirée par la gravité est censée tomber au sol, soit au bas de l'écran.

Nous allons donc procéder en plusieurs étapes.

  1. Mémoriser l'écran où sera affichée la pomme.
  2. Afficher la pomme.
  3. Faire une pause.
  4. Afficher l'écran mémorisé sans la pomme.
  5. Déplacer la pomme.

Ça marche, mais déception, l'animation est saccadée, et surtout ça clignote.

Une fois l'écran d'origine mémorisé, les étapes deviennent : copier en mémoire de travail cet écran d'origine. Y copier ensuite la pomme. Afficher cette mémoire de travail. Déplacer la pomme.

Reprenons le code. Cela permet de ne faire qu'un appel au contexte de l'écran et non plus trois, d'où un gain de temps dans les traitements qui s'explique facilement, car l'accès aux mémoires est bien plus rapide que l'accès à l'écran.

VIII. Animation de sprites : le vol d'un oiseau

Illustrer une pomme qui tombe ne nécessite qu'une image. Il en est autrement pour le vol d'un oiseau.

Comme pour un dessin animé, nous avons besoin d'enchaîner différentes images qui décomposent le battement des ailes.

Après retraitement j'ai obtenu huit fichiers BMP de 75 x 84 pixels nommés Vol1 à Vol8, avec 0 en couleur de fond.

Le code est semblable à celui étudié pour le déplacement de la pomme, car le principe est le même.

Huit mémoires image devront donc être créées, en plus de la mémoire de l'écran d'origine et de la mémoire de travail.

Alors pour simplifier le code, nous allons utiliser un type personnalisé dimensionné de -1 à 8, où les images du Sprite du vol seront notées 1 à 8.

' Incrément l'indice dans la liste des images.

Certains développeurs utilisent les termes de héros, de lutin (Sprite en anglais) ou d'avatar pour désigner ces « personnages » animés qui sont présents dans leurs jeux.

Nous avons déjà pratiquement fait le tour des API de base nous permettant de programmer en mode graphique.

IX. Gestion des touches et module Img

Retrouvez la liste des codes nVirtKey des touches dans l'aide d'Excel à la rubrique : « Constantes de code de touches ».

Ces procédures seront regroupées dans le module Img.

X. Écriture de texte : opaque vs. transparence

Nous avons vu deux possibilités : écrire sur un fond opaque, ou écrire en transparence.

' Recherche la hauteur réelle du texte, c.-à-d.

La procédure calcule la hauteur réelle d'un caractère dans la police choisie, de façon à optimiser l'affichage pour un texte écrit en transparence.

Pour cela il faut faire un test en écrivant un caractère dans une mémoire temporaire et rechercher dans cette mémoire où est la dernière ligne de la couleur de fond.

tags: #generation #zero #bug #affichage #viseur

Post popolari: