Introduzione
In questo articolo, vedremo come gestire la rotella del mouse, tramite le api di windows, in particolare applicheremo quando ci si trova in visualizzazione maschere la possibilità di evitare l'uso della rotella, la quale azione provoca lo spostamento dei record in avanti (successivo) o indietro (precedente). A corredo di tale articolo si può scaricare il file di esempio.
Creazione del database
Si crea un nuovo database Microsoft Access 2003, con una tabella chiamata nomi, la quale avrà tre campi id (di tipo contatore) nome (di tipo testo) e cognome (di tipo testo). La valorizziamo con dei valori a proprio piacimento. Si crea una nuova maschera (tramite il wizard) la quale fa riferimento alla tabella nomi, questa maschera la chiamiamo nomi.
Creazione della classe
Nel database, avremo una classe, la quale sarà utilizzata nella maschera. Aggiungiamo al database una classe (inserisci ->Modulo di classe) con il nome "ClsBloccaRotella", di seguito si riporta il listato completo di tale classe.
Option Compare Database
Option Explicit
'oggetto che eredita dalla form
Private frm As Access.Form
'variabile per annulare l'operazione
Private intCancel As Integer
Public Event Blocca(ByVal Cancel As Integer)
Public Property Set NomeForm(frmIn As Access.Form)
'proprietà che definisce il form a cui bisogna bloccare la rotellina
Set frm = frmIn
End Property
Public Property Get MouseRuotaCancel() As Integer
'proprietà che ci restituisce se l'impostazione è di bloccare o no la rotella
MouseRuotaCancel = intCancel
End Property
Public Sub SubClassHookForm()
'blocca la form
lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
CMouse = Me
End Sub
Public Sub SubClassUnHookForm()
'sblocca la rotella
Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Public Sub BloccaRotella()
'intercetta la rotella ed avvia il blocaggio della rotellina
RaiseEvent Blocca(intCancel)
End Sub
La proprietà NomeForm, imposta il nome della form a cui saranno applicate le funzioni di blocco (subClassHookForm) e sblocco (subClassUnHookForm) mentre la proprietà MouseRuotaCancel Imposta o restituisce se l'azione di blocco della rotella va bloccata o no. Infine abbiamo l'evento bloccaRotella che viene sollevato quando si agisce sulla rotella del mouse.
Creazione del modulo di classe
Nel modulo saranno riportati le dichiarazione delle api (funzioni di windows) che vengono utilizzati nella classe creata precedentemente, funzioni per il blocco e sblocco della rotella, di seguito si riporta il codice completo del modulo bas. Per inserire un modulo, selezionare dalla voce di menu inserisci la voce Modulo, il modulo creato avrà il nome MdlDichiarazioni.
Option Compare Database
Option Explicit
'api per la gestion del mouse
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4
Public Const WM_MouseWheel = &H20A
Public lpPrevWndProc As Long
'oggetto che deriva dalla classe
Public CMouse As ClsBloccaRotella
Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
'utilizzo dell'api per intercettare i vari messaggi
Select Case uMsg
Case WM_MouseWheel
CMouse.BloccaRotella()
If CMouse.MouseRuotaCancel = False Then
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End If
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function
Come si vede dal listato, sono richiamati due funzioni api, le quali permettono di intercettare i messaggi di windows (spostamento della rotellina del mouse) la funzione WindowProc verifica il messaggio di windows, e nell'eventualità che si verifichi lo spostamento della rotellina, esegue la funzione bloccarotella per scatenare il sudetto evento.
Modifica della maschera
A questo punto, selezioniamo la nostra maschera (nomi), e passiamoci in visualizzazione codice, di seguito si riporta il codice per la suddetta maschera.
Option Compare Database
Option Explicit
'dichiarazione dell'oggetto di tipo clsbloccarotella (classe creata precedente
Private WithEvents clsBlocca As ClsBloccaRotella
Private Sub Form_Load()
'instanzio la form
clsBlocca = New ClsBloccaRotella
clsBlocca.NomeForm = Me
'chiamo la funzione per bloccare o no la rotella
clsBlocca.SubClassHookForm()
End Sub
Private Sub Form_Close()
'chiudo la form e quindi rilascio le varie risorse
clsBlocca.SubClassUnHookForm()
clsBlocca.NomeForm = Nothing
clsBlocca = Nothing
End Sub
Private Sub clsBlocca_Blocca(ByVal Cancel As Integer)
'Visualizzo un messaggio
MsgBox("Rotella del mouse blocca")
Cancel = True
End Sub
L'evento blocca dell'oggetto clsblocca, viene scatenato (eseguito) qualora si prova a spostare la rotellina del mouse, nell'evento load della maschera, viene applicata alla proprietà NomeForm della classe clsblocca il nome della maschera su cui effettuare l'azione (funzione) di blocco (SubClassHookForm). Mentre nell'evento close della maschera, viene avviata l'azione (funzione) per lo sblocco (SubClassUnHookForm) e la distruzione dell'oggetto clsblocca.
Conclusioni
In questo articolo si è visto come aggiungere alle nostre applicazioni di tipo Microsoft Access 2003, la gestione della rotellina del mouse, in particolare per il blocco della sua funzionalità. Il blocco può tornare utile qualora per maldestro uso del mouse, non si vuole scorrere tra i record (eventualmente in fase di scrittura) . Tramite la voce download è possibile scaricare il file di esempio.
Download esempio