Modificar el comportamiento de MouseWheel de un cuadro combinado
-
08-07-2019 - |
Pregunta
Tengo un UserControl que contiene TextBoxes y ComboBoxes y este UserControl está contenido en un Panel con AutoScroll configurado en True.
Cuando un cuadro de texto tiene el foco y me desplazo con la rueda del mouse, luego el panel se desplaza, cuando un cuadro combinado tiene el foco y me desplazo con la rueda del mouse, entonces el elemento seleccionado en el cuadro combinado cambia.
Estoy seguro de que este es el comportamiento previsto, pero es algo que me gustaría cambiar, para que todos los eventos de la rueda del mouse desplacen el panel.
Para hacer esto, estoy manejando el mensaje WM_MOUSEWHEEL en el método WndProc en una subclase de ComboBox de la siguiente manera:
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
¿Hay alguna manera de hacer esto sin recurrir a llamar a un método privado en un control mediante reflexión?
Solución
Puede usar la función Win32 SendMessage
para reenviar el contenido de su mensaje, m
, a Parent.Handle
.