Apparition au bout de 3s d'une commande pour copier l'image

Résolu
Signaler
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008
-
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
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.

Merci par avance pour vos suggestion.

Eleasias

8 réponses

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
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
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

J'ai essayé la méthode de Renfield et en fait ca fait bien quelque chose quand on ne bouge plus sur l'image mais en fait ca ferme VBA et excel.

Je ne comprends pas pourquoi.

Eleasias
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Merci beaucoup ca marche nikel.

Eleasias
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

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

Merci par avance

Eleasias
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
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