Bloccare la rotella del mouse in Microsoft Access

In questo articolo, vedremo come in Visual Basic Application, possiamo gestire la rotella del mouse, nel programma Microsoft Access 2003.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

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