我正在设计一个底部停靠水平滚动条的表单。我想使用鼠标倾斜按钮添加对横向滚动的支持,并找到了这个解决方案,经过一番修改后,它似乎可以解决问题——也就是说,虽然表单只在其表面上绘制了 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?