Eleasias
Messages postés36Date d'inscriptionmardi 18 mars 2008StatutMembreDernière intervention31 mars 2008
-
27 mars 2008 à 10:53
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
27 mars 2008 à 16:07
Redirection
Bonjour,
J'ai une image dans une userform. J'aimerai avoir un bouton,en lieu fixe sur l'image, qui s'affiche au bout de 2-3s d'immobilité du curseur (le temps n'est pas important tant qu'il n'est ni trop court ni trop long).
Ce bouton pourrait mettre mon image dans le presse-papier (copy).
En fait ce serait comme sur certains site internet où l'on peut copier ou enregistrer des images.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2008 à 14:08
un peu de ménage (KillTimer) s'impose, en effet:
UserForm:
-----------------------
Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If mhTimer Then
KillTimer 0, mhTimer
End If
mhTimer = SetTimer(0, 0, 3000, AddressOf TimerProc)
End Sub
Private Sub UserForm_Terminate()
If mhTimer Then
KillTimer 0, mhTimer
End If
End Sub
--------------------------
Public Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public mhTimer As Long
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
KillTimer 0, mhTimer
mhTimer = 0
UserForm1.CommandButton1.Visible = True
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2008 à 12:05
Dans un module:
---------------------
Option Explicit
Public Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public mhTimer As Long
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
UserForm1.CommandButton1.Visible = True
End Sub
dans ta UserForm:
----------------------------------
Option Explicit
Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
mhTimer = SetTimer(0, 1, 3000, AddressOf TimerProc)
End Sub
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 mars 2008 à 12:17
Salut
Sous VBA, on ne dispose pas de Timer qui permettrait d'exécuter un code cycliquement.
(voir aussi les questions du forum à propos des Timer sous VBA)
Tu peux utiliser l'évènement monImage_MouseMove qui se déclenchera à chaque fois que la souris se déplace à l'intérieur de ton image.
Suffit ensuite de mémoriser la position X et Y fournie par l'évènement afin de pouvoir la comparer (*) lors d'un prochain déclenchement + mémoriser l'heure à laquelle la position a été mémorisée. Pour calculer des différences entre deux dates, utilise DateDiff
(*) comparer : les positions ne pourront pas être strictement identiques, ce n'est pas possible puisqu'on déclenche l'évènement lors d'un Move de la souris, donc prévoir une comparaison à 10 ou 20 Twips (ou bien 2 ou 3 Pixels selon ton ScaleMode) près, en plus ou en moins, sur chaque X ou Y.
Ensuite, faire apparaitre un bouton : Suffira que tu aies posé un bouton sur ta UserForm et que tu joues avec le propriété .Visible pour le faire disparaitre ou apparaitre + un .Move pour le déplacer à l'endroit X,Y que tu as mémorisé
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 mars 2008 à 12:19
Ah bah la solution de RenField est plus complète et surement plus efficace.
Suffit que tu la complètes avec le test "souris presque immobile" dont je parlais
Vous n’avez pas trouvé la réponse que vous recherchez ?
Eleasias
Messages postés36Date d'inscriptionmardi 18 mars 2008StatutMembreDernière intervention31 mars 2008 27 mars 2008 à 16:02
Euh comment on fait pour avoir le même effet mais sur deux images différentes indépendamment. Et si possible que le bouton "copier" disparaisse au bout du même temps si le curseur n'est pas dessus
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2008 à 16:07
tu as toutes les billes en main...
tu as une procédure (TimerProc) qui est appelée actuellement au bout de trois secondes d'inactivité de la souris au dessus de Image1
a toi de désactiver ce Timer si le curseur sort de l'image1 - ou plus simple: avant d'afficher le bouton, assures toi que le curseur se trouve sur l'image (GetCursorPos, GetClientRect, ScreenToClient)
pour faire ça pour deux images, rien ne change... tu peux ajouter une variable publique qui stockera l'ID de l'image survollée