Ce second exercice vous apprendra
comment réaliser l'animation d'un objet de forme complexe sur
un arrière-plan avec rapidité. Il fait appel à la fonction
API BitBlt Commencez par télécharger les fichiers suivants
dont vous aurez besoin pour votre réalisation: Paysage.bmp,
Vaisseau.bmp, Vaisseau_masque.bmp.
Remaquez que dans l'image qui sera déplacée, la section
transparente est en noir alors que, dans le masque, cette
même section est blanche: ce sont les couleurs qui sont
remplacées par le noir.
- Commencez par lancer un nouveau
projet que vous sauvegardez sous le nom Ex_2xx.vbp.
Laissez les propriétés de la feuille par défaut sauf
pour les caractéristiques suivantes:
- NAME: Animation
- CAPTION: BitBlt
- Ajoutez ensuite un contrôle Zone
d'image (PictureBox). Nommez-le IM_Arrière.
Sélectionnez l'image Paysage.bmp (téléchargée
au début de cette fiche) pour la propriété PICTURE.
La hauteur (HEIGHT) devrait être à 3705 et la
largeur (WIDTH) à 4680. Placez cet objet comme
dans le modèle un peu plus bas. Les propriétés AUTOSIZE
et AUTOREDRAW doivent être à True et SCALEMODE
à Pixel.
- Ajoutez ensuite trois autres
contrôles Zone d'image (PictureBox). Les trois ont la propriété
HEIGHT réglée à 1185 et la propriété WIDTH
à 1095. Nommez le premier IM_vaisseau, le second
IM_masque et le troisième IM_tempor.
Assurez-vous aussi que AUTOSIZE, AUTOREDRAW et HASDC
sont initialisés à True pour les trois. Enfin, SCALEMODE
doit indiquer 3-Pixel.
- Insérez l'image Vaisseau.bmp
dans la propriété PICTURE de IM_vaisseau
et Vaisseau_masque.bmp dans celle de IM_masque.
IM_tempor ne contient pas d'image pour le moment.
- Créez un bouton ayant Animer
comme CAPTION et BO_Animer comme NAME.

-
Vous devez maintenant ajouter les
instructions nécessaires à l'animation. Copiez d'abord le code suivant
dans la feuille pour déclarer la fonction API.
Private Declare Function BitBlt _
Lib "gdi32" ( _
ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal dwRop As Long _
) As Long
'Déclaration de la fonction API
-
Ajoutez ensuite le
code ci-dessous dans le bouton Bo_Animer.
Private Sub Bo_Animer_Click()
Static V_X, V_Y, V_L, V_H As Long
'Déclaration des variables
Static V_arrplan As Boolean
Dim V_Anc As Long
V_X = -IM_vaisseau.ScaleWidth
'Emplacement de départ
V_Y = IM_arrière.ScaleHeight
V_L = IM_Vaisseau.ScaleWidth
'Enregistre les tailles dans des variables locales
V_H =IM_Vaisseau.ScaleHeight
' pour aller plus vite
Do
'Boucle d'animation
'Restaure l'arrière-plan sauf si c'est la première fois
que l'on dessine l'objet
If V_arrplan = True Then
V_Anc =
BitBlt(Im_arrière.hDC, V_X, V_Y, V_L, V_H, _
IM_tempor.hDC, 0, 0, vbSrcCopy)
'Arrête le déplacement de
l'image quand elle atteint les bords
If V_X >
IM_arrière.ScaleWidth Then
V_arrplan = False
IM_arrière.Refresh
Exit Do
End If
End If
'Déplace l'image
V_X = V_X + 1
If V_X < 0.5 * IM_arrière.ScaleWidth _
Or V_X > 0.8 *
IM_arrière.ScaleWidth Then
V_Y =V_Y - 1
Else
V_Y = V_Y + 1
End If
'Sauvegarde l'arrière-plan du nouvel emplacement
V_Anc = BitBlt(IM_tempor.hDC, 0, 0,
V_L, V_H, _
IM_arrière.hDC,
V_X, V_Y, vbSrcCopy)
V_arrplan = True
'Application du masque
V_Anc = BitBlt(IM_arrière.hDC,
V_X, V_Y,V_L,V_H, _
IM_Masque.hDC, 0, 0,
vbSrcAnd)
'Dessin de l'image
V_Anc = BitBlt(IM_arrière.hDC,
V_X, V_Y,V_L,V_H, _
IM_Vaisseau.hDC, 0, 0,
vbSrcPaint)
IM_arrière.Refresh
Loop
End Sub
-
Voici venu le temps
d'essayer votre animation. Mais, auparavant, commencez par
sauvegarder pour éviter les mauvaises surprises.
-
Il est possible de
cacher les fenêtres du haut afin de ne voir que
l'animation. Pour ce faire, il suffit de régler la
propriété Visible de chaque Zone d'image (PictureBox)
-sauf le paysage, comme de raison- à False. Faites-le et
testez à nouveau votre animation avant de sauvegarder
sous le nom Ex_2bxx.vbp.
Application:
- Créez une nouvelle animation en
utilisant un arrière-plan et une image de votre choix.
N'oubliez pas de créer votre masque à l'aide d'un
logiciel de dessin. Enregistrez-le sous le nom Ex_2cxx.vbp.
|