1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| Exemple d'utilisation de fonctions API
Le clic simple et le double-clic sur un contrôle (par exemple un objet Image) sont interceptés respectivement par les événements VBA Click et DblClick :
Private Sub Image1_Click()
MsgBox "Clic simple sur l'image"
End Sub
Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "Double-clic sur l'image"
End Sub
Si on veut gérer à la fois le clic et le double-clic sur l'image, avec VBA on se retrouve coincé : quand on double-clique, la procédure Image1_Click est appelée en premier et empêche Image1_DblClick de se déclencher.
Les fonctions API (plus quelques petites astuces de programmation!) permettent de résoudre ce problème :
Private Declare Function GetTickCount Lib "Kernel32" () As Long
Private Declare Function GetDoubleClickTime Lib "User32" () As Integer
Dim bDblClick As Boolean
Private Sub Image1_Click()
Dim T As Long
T = GetTickCount
Do: DoEvents
Loop While GetTickCount - T < GetDoubleClickTime
If Not bDblClick Then MsgBox "Simple clic sur l'image" _
Else bDblClick = False
End Sub
Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "Double-clic sur l'image"
bDblClick = True
End Sub
La fonction API GetTickCount permet de connaître le nombre de millisecondes écoulées depuis le démarrage du système. Cette fonction est plus précise que la fonction analogue Timer de VBA, qui serait inappropriée ici.
La fonction GetDoubleClickTime permet de connaître le laps de temps définissant un double-clic (nombre de millisecondes maximal entre le 1er et le 2ème clic).
Les instuctions Private Declare Function... indiquent à VBA que ces deux fonctions peuvent être utilisées, en définissant leur nom, la librairie dans laquelle elles se trouvent (respectivement Kernel32 et User32), les arguments, ici () car ces deux fonctions n'en ont pas, et le type de valeur renvoyée (respectivement le type Long et le type Integer).
L'astuce est la suivante :
* S'il se produit un clic sur l'image, la procédure Image1_Click est déclenchée
* Cette procédure "attend" qu'un 2ème clic se déclenche éventuellement (boucle Do... Loop). Cette attente continue jusqu'à ce que l'intervalle de temps maximale du 2ème clic (GetDoubleClickTime) soit écoulé.
* Dans cette intervalle, la boucle Do... Loop appelle "en rafale" la fonction DoEvents. Cette fonction rend temporairement la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente.
* Si dans l'intervalle un deuxième clic se produit, le système d'exploitation va alors provoquer l'appel (grâce à DoEvents) de la procédure Image1_DblClick. Celle-ci va gérer le double-clic, mettre la valeur True dans la variable bDblClick et rendre le contrôle à Image1_Click.
* A la fin de la boucle, on peut donc savoir s'il y a eu double-clic (bDblClicj = True) ou non (bDblClick = False) et agir en conséquence.
Sans fonctions API, VBA rendrait difficile ce genre d'opération car il ne permet pas, entre autres, de connaître des informations du système comme l'intervalle du double-clic. |
Partager