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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| Option Compare Database
Option Explicit
'************************************************************************************************************
' Fonction de remplacement du DoEvents
' N'autorise que le click sur un bouton particulier
' Annule les autres événements clavier et souris
'************************************************************************************************************
' Lecture file des messages
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
' Traduit le message
Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
' Envoie le message
Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
' lit la position du curseur
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
' Charge un cursor
Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
' Défini le curseur
Private Declare Function SetCursor Lib "user32" (ByVal hCursor As Long) As Long
Private Const IDC_HAND = 32649 ' Curseur Main
Private Const HT_CAPTION = 2 ' Barre de titre
Private Const HTMINBUTTON = 8 ' Bouton minimiser
Private Const HTMAXBUTTON = 9 ' Bouton maximiser
Private Const HTCLOSE = 20 ' Bouton fermer
Private Const WM_LBUTTONDOWN = &H201 ' Click gauche
Private Const WM_NCLBUTTONDOWN = &HA1 ' Click gauche sur barre de titre
Private Const WM_NCLBUTTONUP = &HA2 ' Click gauche sur barre de titre
Private Const PM_REMOVE = &H1 ' Supprime le message lu
Private Const WM_MOUSEFIRST = &H200 ' Premier message souris
Private Const WM_MOUSELAST = &H209 ' Dernier message souris
Private Const WM_KEYFIRST = &H100 ' Premier message clavier
Private Const WM_KEYLAST = &H108 ' Dernier message clavier
' Type point pour API
Public Type POINTAPI
x As Long
y As Long
End Type
' Type message pour API
Public Type MSG
hWnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
'*******************************************************************************
' Renvoie Vrai si on a cliqué sur le contrôle pCtrl
' Les autres messages clavier et souris sont annulés
'*******************************************************************************
' pForm : Formulaire
' pCtrl : Contrôle qui doit rester activé
' pAllowMove : Autorise le déplacement du formulaire
' pAllowMinimize : Autorise la réduction du formulaire
' pAllowMaximize : Autorise l'agrandissement du formulaire
' pAllowClose : Autorise la fermeture du formulaire
'*******************************************************************************
Public Function CheckClick(pForm As Access.Form, pCtrl As Access.Control, Optional pAllowMove As Boolean, Optional pAllowMinimize As Boolean, Optional pAllowMaximize As Boolean, Optional pAllowClose As Boolean) As Boolean
On Error GoTo gestion_erreurs
Dim lmsg As MSG
Dim lp As POINTAPI
Dim lx As Long, ly As Long, lw As Long, lh As Long
Dim hCur As Long
Dim lOldMousePointer As Long
' Ancien pointeur de la souris
lOldMousePointer = Screen.MousePointer
' Position du contrôle sur l'écran
pCtrl.accLocation lx, ly, lw, lh
' Recherche de message souris sur le formulaire (les messages lus sont supprimés)
While PeekMessage(lmsg, pForm.hWnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) <> 0
' Vérifie si la souris est sur le contrôle
If lmsg.pt.x > lx And lmsg.pt.x < (lx + lw) And lmsg.pt.y > ly And lmsg.pt.y < (ly + lh) Then
' Envoie le message
TranslateMessage lmsg
DispatchMessage lmsg
' Vérifie si on a cliqué sur le contrôle
If lmsg.message = WM_LBUTTONDOWN Then CheckClick = True
End If
Wend
' Recherche de message click sur la barre de titre(les messages lus sont supprimés)
While PeekMessage(lmsg, pForm.hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONUP, PM_REMOVE) <> 0
' Vérifie si le message doit être envoyé
If (pAllowMove And lmsg.wParam = HT_CAPTION) Or (pAllowMinimize And lmsg.wParam = HTMINBUTTON) Or _
(pAllowMaximize And lmsg.wParam = HTMAXBUTTON) Or (pAllowClose And lmsg.wParam = HTCLOSE) Then
' Envoie le message
TranslateMessage lmsg
DispatchMessage lmsg
End If
Wend
' Supprime les messages clavier sur le formulaire
While PeekMessage(lmsg, pForm.hWnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) <> 0
Wend
' Supprime les messages souris sur l'application
While PeekMessage(lmsg, Application.hWndAccessApp, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) <> 0
Wend
' Supprime les messages clavier sur l'application
While PeekMessage(lmsg, Application.hWndAccessApp, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) <> 0
Wend
' Lit la position du curseur
GetCursorPos lp
' Vérifie si la souris est sur le contrôle
If lp.x > lx And lp.x < (lx + lw) And lp.y > ly And lp.y < (ly + lh) Then
' Change le curseur en Main lorsqu'on survole le contrôle
hCur = LoadCursor(0, IDC_HAND)
If (hCur > 0) Then
lOldMousePointer = Screen.MousePointer
SetCursor hCur
End If
Else
' Rétablit le curseur d'origine si on quitte le contrôle
Screen.MousePointer = lOldMousePointer
End If
gestion_erreurs:
If Err.Number <> 0 Then MsgBox Err.Description
End Function |
Partager