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?

È stato utile?

Soluzione

È possibile utilizzare la funzione Win32 SendMessage per inoltrare il contenuto del messaggio, m , a Parent.Handle .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top