Я разрабатываю форму с горизонтальной полосой прокрутки, закрепленной внизу. Я хотел добавить поддержку боковой прокрутки с помощью кнопок наклона мыши и нашел это решение, которое , после небольшой переделки, похоже, справился с задачей — то есть форма имела только графику GDI, нарисованную на ее поверхности.
Однако с тех пор я добавил в форму некоторые элементы управления и обнаружил, что когда мышь находится над любым из элементов, операция наклона срабатывает только один раз, а не повторно, как это происходит, когда мышь находится над любой другой частью формы.
Чтобы понять, что я имею в виду (если у вас есть мышь с кнопками наклона), прикрепите горизонтальную полосу прокрутки к нижней части формы, добавьте несколько других элементов управления и вставьте этот код:
Public Class Form1
Const WM_MOUSEHWHEEL As Integer = &H20E
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If Me.IsDisposed OrElse m.HWnd <> Me.Handle Then Return
Select Case m.Msg
Case WM_MOUSEHWHEEL
With HScrollBar1
If CType(m.WParam, Integer) < 0 Then '______________ Left Scroll
If .Value > 0 Then .Value -= 1
Else '______________________________________________ Right Scroll
If .Value < (.Maximum - .LargeChange + 1) Then .Value += 1
End If
End With
m.Result = CType(1, IntPtr) 'Indicates the message has been handled
End Select
End Sub
Private Sub HScrollBar1_ValueChanged(sender As Object, e As System.EventArgs) Handles HScrollBar1.ValueChanged
Console.WriteLine(HScrollBar1.Value)
End Sub
End Class
Вы увидите, что боковая прокрутка повторяется, когда мышь находится над пустой частью формы, но только «однократно», когда она находится над элементом управления.
Я предполагаю, что решение лежит где-то в значении .Result
сообщения, но я не понимаю, каким оно должно быть. На самом деле я даже не уверен, что в любом случае возвращаю правильное значение, потому что код в исходном решении вызвал исключение для функции DirectCast, поэтому я заменил его на CType, который, похоже, работал нормально. Я пытался решить это с помощью Spy++, но не вижу ничего очевидного.
Любые идеи, пожалуйста?
ОБНОВЛЕНИЕ
Я заметил, что когда я включаю «дочерние» окна в Spy++, появляются два (0x020E) сообщения и два возвращаемых значения, 1 и 0. Я предполагаю, что сообщение передается элементу управления формой. Итак, я предполагаю, что теперь возникает вопрос: можно ли предотвратить передачу сообщения элементу управления? Или можно ли перехватить возвращаемое значение элемента управления и преобразовать его в 1?