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?

¿Fue útil?

Solución

Puede usar la función Win32 SendMessage para reenviar el contenido de su mensaje, m , a Parent.Handle .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top