Modifica del comportamento della rotellina del mouse di una casella combinata
-
08-07-2019 - |
Domanda
Ho un UserControl contenente TextBox e ComboBox e questo UserControl è contenuto in un Pannello con AutoScroll impostato su True.
Quando una casella di testo ha lo stato attivo e io scorro con la rotellina del mouse, quindi il pannello scorre, quando una casella combinata ha lo stato attivo e io faccio scorrere con la rotella del mouse, quindi l'elemento selezionato nella casella combinata cambia.
Sono sicuro che questo è il comportamento previsto ma è qualcosa che vorrei cambiare, in modo che tutti gli eventi della rotellina del mouse scorrano il pannello.
Per fare ciò sto gestendo il messaggio WM_MOUSEWHEEL nel metodo WndProc in una sottoclasse ComboBox come segue:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_MOUSEWHEEL As Integer = &H20A
Select Case m.Msg
Case WM_MOUSEWHEEL
' Send the message to the parent
GetType(Control).InvokeMember("WmMouseWheel", Reflection.BindingFlags.InvokeMethod Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic, Nothing, Parent, New Object() {m})
Return
End Select
MyBase.WndProc(m)
End Sub
C'è un modo per farlo senza ricorrere alla chiamata di un metodo privato su un controllo tramite la riflessione?
Soluzione
È possibile utilizzare la funzione Win32 SendMessage
per inoltrare il contenuto del messaggio, m
, a Parent.Handle
.