Tuto : Gestion des MouseEvents au-dessus d'images

Hello, Hello,

rdi2: Petit partage de tuto à la suite de mon appli. Jeu : Z Défense : Mission Hellfest 8) dispo sur le site.

Le jeu gère des codes qui permettent de déplacer une image au-dessus d'une autre image et d'auto-sélectionner la cellule où se trouve la souris et ce tuto explique en détails le fonctionnement et l'organisation nécessaire pour y parvenir.

screen tuto events souris

Le tuto, contient de quoi permettre de comprendre :

> Comment capturer la position de la souris au-dessus d'une plage cellules et d'une image à l'aide de MouseMove.

> Comment déplacer une image au-dessus d'une autre suivant l'emplacement du clic souris à l'aide de MouseDown.

> Comment créer un petit RPG avec un pingouin, interagissant avec un décor

Voilà le tuto est dispo ici :

https://www.excel-pratique.com/fr/telechargements/doc-vba/comment-gerer-evenements-souris-excel-vba-no294.php

Masterclass & Outils dans ce topic permettant aussi :

> Gestion des clics des différents boutons de la souris

> Outil d'export de table pour le calcul des position x,y de la souris au-dessus de la carte

> Méthode pour animer un sprite comme dans un jeu courant

Bon codage

Masterclass

logo1 tuto

En complément, je proposerai ici des Masterclass & des outils sur des codes de gestion de souris toujours dans la thématique RPG.


SOMMAIRE

1. MASTERCLASS : GESTION DU CLIC GAUCHE/DROIT SOURIS

2. OUTIL D'EXPORT TABLE POUR LE CALCUL TAILLES CELLULE ET GERER LES POS X;Y DE LA SOURIS

3. TUTO : ANIMER UN SPRITE AVEC UNE SPRITESHEET


1. MASTERCLASS : GESTION DU CLIC GAUCHE/DROIT SOURIS

screen tuto gestion clic souris

Alors dans ce Masterclass, nous allons voir comment gérer les clics boutons de la souris, toujours en utilisant le principe de notre "ensemble" (cf tuto 1er post), à l'aide de l'événement MouseMove du Label.

VBA ne permet pas de base de capter les événements souris, mais Il est possible avec un contrôle Activex (entre autre) de capter les clics des boutons de la souris avec les événements : MouseMove ; MouseDown ; MouseUp ; Click ; DblClick.

* En suivant le lien DblClick, événement, vous verrez que ces événements agissent suivant un ordre (quand ceux-ci ne sont pas empêchés par des événements invalidant).

> Les événements Click et DblClick sont limités, leur fonction n'est que de capter le clic ou le double clic au-dessus du contrôleur, nous allons donc nous concentrer sur les autres événements qui de base gèrent cette info, ce qui simplifiera le codage.

Click, événement : https://msdn.microsoft.com/fr-fr/library/office/gg264479.aspx

Label.DblClick, événement : https://msdn.microsoft.com/fr-fr/library/office/ff845177.aspx

> Reste les événements MouseMove ; MouseDown ; MouseUp, ces événements ont la particularité d'avoir les mêmes paramètres, ceux-ci peuvent donc gérer les clics souris selon la nature des boutons et suivant leur principe d'événement.

Dans le tuto par souci de simplification, les événements ont été compartimentés, l'événement MouseMove (déplacement souris) était utilisé pour gérer uniquement le déplacement du curseur au-dessus de l'ensemble et l'événement MouseDown (bouton appuyé) pour gérer le déplacement par clic du sprite.

Mais ici nous n'allons utiliser que l'événement MouseMove , cet événement est très puissant, en effet, on peut gérer à la fois la capture du mouvement de la souris, mais aussi les différents clic de la souris .

MouseMove, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff836610.aspx

MouseUp, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff197657.aspx

MouseDown, Événement : https://msdn.microsoft.com/fr-fr/library/office/ff197358.aspx

Sous procédure gérant spécifiquement l’appui des boutons de la souris

Syntaxe de l'événement MouseMove : expression.MouseMove(Button, Shift, X, Y)

Button // Suivant la valeur renvoyé par le paramètre, il est possible de savoir si le bouton est relâché ou appuyé pour déclencher l'événement et en même temps savoir lequel est appuyé.

> Button = 0 => Aucun boutons de la souris appuyés

> Button = 1 => Bouton Gauche de la souris appuyé

> Button = 2 => Bouton Droit de la souris appuyé

> Button = 3 => Bouton Central de scrolling de la souris appuyé

Shift // Permet de tester si les touches MAJ / CTRL / ALT sont appuyées

X, Y // Permettent de capter la position en twips du curseur de la souris

Donc grâce au seul paramètre Button, nous pouvons savoir si un bouton est appuyé et si oui lequel.

Ce qui va permettre en utilisant un codage IF, de tester la valeur Button et de faire des actions spécifique, en fonction du clic gauche ou droit au dessus de notre "ensemble".

Exemple de procédure de gestion du clic gauche (entrer dans la cellule) et droit (montrer le menu contextuel) :

'-------------------------------------------------------------------------------------
'III. Gestion MouseMove au niveau du clic souris
    'Button = 0 => Aucun boutons de la souris appuyés
    'Button = 1 => Bouton Gauche de la souris appuyé
    'Button = 2 => Bouton Droit de la souris appuyé
    'Button = 3 => Bouton Central de la souris appuyé
    'En l'état du codage proposé, utiliser l'événement clic ici, empêchera d'utliser les événéments DbleClick / Click / MouseDown

    'Exemple code, avec codage gérant la variable 0 du bouton, sans gestion des OPTIONS clic souris
    If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
        '-------------------------------------------------
        'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
        MAP.Visible = False 'désactiver l'affichage du label
        Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
        MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
        Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
        '-------------------------------------------------
        If Button = 1 Then 'Si bouton gauche de la souris appuyé
            SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
        End If
        '-------------------------------------------------
        If Button = 2 Then 'si bouton droit de la souris appuyé
            Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
        End If
        '-------------------------------------------------
    End If
    '-------------------------------------------------

Exemple de procédure complète de l'événement MouseMove, gérant à la fois le déplacement du curseur et de lancer une action spécifique suivant le clic gauche ou droit de la souris.

Suivant l'option choisie sur la feuille du classeur, le clic gauche ou droit de la souris donnera une action différente (soit 4 actions possibles) :

Clic gauche : Entrer dans la cellule Ou Afficher un message donnant l'emplacement de la souris

Clic droit : ouverture du menu contextuel Ou Afficher un message renvoyant la valeur à l'intérieur de la cellule

'Macro captant le mouvement et gérant les clics de la souris au dessus de la Map
'Explications que pour le point III. afin d'alléger le code
Private Sub MAP_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'-------------------------------------------------------------------------------------
Dim adress_curs, ancien_adress_curs As String
'-------------------------------------------------------------------------------------
On Error Resume Next
'-------------------------------------------------------------------------------------
'I. Auto-sélection cellule suivant position curseur souris
ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("POSX").Value = X
ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("POSY").Value = Y
adress_curs = ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ADRESS_CURSEUR").Value
ThisWorkbook.ActiveSheet.Range(adress_curs).Select
'-------------------------------------------------------------------------------------
'II. Colorisation cellule sélectionnée
If ThisWorkbook.ActiveSheet.Range(adress_curs).Interior.ColorIndex = 2 Then
    If COLORCELLULE.Value = True Then ThisWorkbook.ActiveSheet.Range(adress_curs).Interior.ColorIndex = 42
    ancien_adress_curs = ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ANCIEN_ADRESS_CURSEUR").Value
    ThisWorkbook.ActiveSheet.Range(ancien_adress_curs).Interior.ColorIndex = 2
    ThisWorkbook.Worksheets("Tab Calc Pos Souris").Range("ANCIEN_ADRESS_CURSEUR").Value = adress_curs
End If
'-------------------------------------------------------------------------------------

'-------------------------------------------------------------------------------------
'III. Gestion MouseMove au niveau du clic souris
    'Button = 0 => Aucun boutons de la souris appuyés
    'Button = 1 => Bouton Gauche de la souris appuyé
    'Button = 2 => Bouton Droit de la souris appuyé
    'Button = 3 => Bouton Central de la souris appuyé
    'En l'état du codage proposé, utiliser l'événement clic ici, empêchera d'utliser les événéments DbleClick / Click / MouseDown

    'Exemple code, avec codage gérant la variable 0 du bouton, avec gestion des OPTIONS clic souris
    If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
        '-------------------------------------------------
        'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
        MAP.Visible = False 'désactiver l'affichage du label
        Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
        MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
        Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
        '-------------------------------------------------
        If Button = 1 Then 'Si bouton gauche de la souris appuyé et suivant option sélectionné d'événement clic
            If OPTION_BOUTGAUCHE.Value = False Then MsgBox "Le curseur se trouve au-dessus de la cellule : " & adress_curs, vbInformation, "Evénement clic gauche" 'Afficher un message avec l'adresse de la cellule
            If OPTION_BOUTGAUCHE.Value = True Then SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
        End If
        '-------------------------------------------------
        If Button = 2 Then 'si bouton droit de la souris appuyé et suivant option sélectionné d'événement clic
            If OPTION_BOUTDROIT.Value = False Then Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
            If OPTION_BOUTDROIT.Value = True Then MsgBox "La cellule contient le texte suivant : " & ThisWorkbook.ActiveSheet.Range(adress_curs).Value, vbInformation, "Evénement clic droit" 'Afficher un message avec le contenu de la cellule
        End If
        '-------------------------------------------------
    End If
    '-------------------------------------------------

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    'Exemple code, avec codage gérant la variable 0 du bouton, sans gestion des OPTIONS clic souris
    'If Button <> 0 Then 'Si bouton souris différent à aucuns boutons souris appuyé alors
        '-------------------------------------------------
        'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
        'MAP.Visible = False 'désactiver l'affichage du label
        'Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
        'MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
        'Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
        '-------------------------------------------------
        'If Button = 1 Then 'Si bouton gauche de la souris appuyé
            'SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
        'End If
        '-------------------------------------------------
        'If Button = 2 Then 'si bouton droit de la souris appuyé
            'Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel
        'End If
        '-------------------------------------------------
    'End If
    '-------------------------------------------------

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    'Exemple code, avec codage sans variable 0 du bouton, sans gestion des OPTIONS clic souris
    'If Button = 1 Or Button = 2 Then 'Si bouton souris égal boutons souris gauche ou droit appuyé alors
        '-------------------------------------------------
        'Procédure pour éviter le bug de désactivation du mode transparent du label créant un flash long masquant la carte
        'MAP.Visible = False 'désactiver l'affichage du label
        'Application.ScreenUpdating = False 'désactiver raffraichissement de l'écran, on reste sur la dernière vision de l'utilisateur OK
        'MAP.Visible = True 'rerendre label visible, réinitialise le mode transparent
        'Application.ScreenUpdating = True 'réaffichage ok pour l'utilisateur
        '-------------------------------------------------
        'If Button = 1 Then SendKeys "{F2}", False 'entrer dans la cellule, suivant version peut faire perdre verrNum
        '-------------------------------------------------
        'If Button = 2 Then Application.CommandBars("Cell").ShowPopup 'Montrer le menu contextuel 'si bouton droit de la souris appuyé
        '-------------------------------------------------
    'End If
    '-------------------------------------------------

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

End Sub

FIN du Masterclass et voilà maintenant la souris peut faire plusieurs actions au dessus de l'ensemble.

2. OUTIL D'EXPORT TABLE POUR LE CALCUL TAILLES CELLULE ET GERER LES POS X;Y DE LA SOURIS

3. TUTO: COMMENT ANIMER UN SPRITE AVEC UNE SPRITESHEET

Partage d'un tuto dans le thème du pingouin et de la programmation de jeu, sur une méthode pour animer un sprite pingouin à l'aide d'une feuille à sprite ici : https://www.excel-pratique.com/fr/telechargements/doc-vba/animer-sprite-vba-excel-no330.php

Avec vous pouvez reproduire une animation de mouvement et extrapoler la méthode pour faire d'autres types d'animations.

Rechercher des sujets similaires à "tuto gestion mouseevents dessus images"