Вопрос

У меня есть UserControl, содержащий TextBoxes и ComboBoxes, и этот UserControl содержится на панели с AutoScroll, установленной в True.

Когда текстовое поле имеет фокус, и я прокручиваю с помощью колесика мыши, тогда панель прокручивается, когда комбинированный список имеет фокус, и я прокручиваю с помощью колесика мыши, тогда выбранный элемент в комбинированном ящике изменяется.

Я уверен, что это предполагаемое поведение, но я хотел бы изменить его, чтобы все события колесика мыши прокручивали панель.

Для этого я обрабатываю сообщение WM_MOUSEWHEEL в методе WndProc в подклассе ComboBox следующим образом:

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

Есть ли способ сделать это, не прибегая к вызову частного метода для элемента управления с помощью отражения?

Это было полезно?

Решение

Вы можете использовать функцию Win32 SendMessage для пересылки содержимого вашего сообщения, m , в Parent.Handle .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top