Comment déclencher un évt lorsque le curseur sort de la zone d'une fenêtre donnée? par exple l'affichage d'un message si l'utilisateur bouge le curseur hors la fenêtre...
Comment déclencher un évt lorsque le curseur sort de la zone d'une fenêtre donnée? par exple l'affichage d'un message si l'utilisateur bouge le curseur hors la fenêtre...
sur un/uneForm, un CommandButton
Motif de l'edit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Option Explicit Private Type POINTAPI X As Long Y As Long End Type 'pour lire le deplacement du curseur Private Declare Function GetCursorPos Lib "User32" _ (lpPoint As POINTAPI) As Long Dim Retval& 'variable d'appel de la procedure GetCursorPos Dim lpPoint As POINTAPI 'variable de récuperation de la procedure GetCursorPos Dim ArretCtrlCurs As Boolean Private Sub Form_Load() ArretCtrlCurs = True Me.Caption = "Arret" End Sub Private Sub Form_Unload(Cancel As Integer) ArretCtrlCurs = True End Sub Private Sub Command1_Click() If ArretCtrlCurs = True Then ArretCtrlCurs = False SurveilleCurseur Else ArretCtrlCurs = True Me.Caption = "Arret" Me.Refresh End If End Sub Public Sub SurveilleCurseur() Do While ArretCtrlCurs = False DoEvents Retval& = GetCursorPos(lpPoint) DoEvents If lpPoint.Y < ScaleY(Me.Top, vbTwips, vbPixels) Or _ lpPoint.Y > ScaleY(Me.Top + Me.Height, vbTwips, vbPixels) Or _ lpPoint.X < ScaleX(Me.Left, vbTwips, vbPixels) Or _ lpPoint.X > ScaleX(Me.Left + Me.Width, vbTwips, vbPixels) Then Me.Caption = "en dhors" 'recuperer ici la sortire de la boucle avec 'ArretCtrlCurs = true: Exit Do Else Me.Caption = "dedans" End If Loop End Sub
plutôtCar la sortie de la boucle lors de l'Unload ne fonctionne pas toujours
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Do 'While ArretCtrlCurs = False '........ '........ Loop Until ArretCtrlCurs = True![]()
:whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
saut de ligne
OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈
Bonsoir,
Comme deux idées val mieux que rien, je soumet ma solution.
C'est vrai qu'a l'inverse de le solution de ProgElect, il faut mettre la form en pixel.
A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ' Déclaration du type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type POINTAPI X As Long Y As Long End Type Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function GetWindowRect Lib "user32" ( _ ByVal hwnd As Long, lpRect As RECT) As Long Private Sub Form_Load() Me.ScaleMode = 3 'pixel End Sub Private Sub Timer1_Timer() Dim Curs As POINTAPI Dim lgRetVal As Long Dim r As RECT lgRetVal = GetWindowRect(Me.hwnd, r) GetCursorPos Curs If r.Left < Curs.X And r.Right > Curs.X _ And r.Top < Curs.Y And r.Bottom > Curs.Y Then Label3.Caption = "Dedans" Else Label3.Caption = "Dehors" End If End Sub
Comme trois solutions vallent mieux que deux:
http://allapi.mentalis.org/apilist/D...6BB8C2089.html
Bonsoir,
La 3ème solution à justement 3 défauts par rapport à la question.
1°) Quand la souris passe sur un control, l'événement Mouse_Move de la form n'agit plus.
2°) Idem pour l'hwnd
3°) Et quand la souris est hors de la form cela n'agit plus.
A+
J'aime bien le seconde solution. Ça clignote beaucoup moins, voire pas du tout, indépendamment de l'intervalle qu'on met au Timer.
Partager