【问题标题】:Change mouse wheel scroll lines?更改鼠标滚轮滚动线?
【发布时间】:2012-11-23 21:02:28
【问题描述】:

我有一个带有自动滚动功能的面板,我需要更改鼠标滚动行数

我的意思是:

(西班牙语鼠标属性,抱歉)

但我会在我的程序中为我的面板更改它,obvius,而不是在 SO!

PS:例如 Winamp 媒体播放器有一个选项。

我在任何地方都找不到信息,请帮忙。

更新

我的滚动条是一个带有“AutoScroll”属性的面板

我的活动是这样的:

    Private Sub Panel1_MouseScroll(sender As Object, e As MouseEventArgs) Handles Panel1.MouseWheel

    Panel1.Invalidate()

    End Sub

这是我的面板的内容:

  ' Checkbox drawing
Public Sub updatecheckboxes()
    ' delete the old checkboxes
    Panel1.Controls.Clear()
    ' create the new checkboxes
    Dim filesystem = CreateObject("Scripting.FileSystemObject")
    Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
    Dim i As Int32 = 0
    Dim pos As Int32 = 10
    For Each folder In ThisDir.Subfolders
        Array.Resize(mcheck, i + 1)
        mcheck(i) = New CheckBox
        With mcheck(i)
            .AutoSize = True
            .Location = New Point(10, pos)
            .Name = "CheckBox" & i + 1
            .Text = folder.Name
        End With
        Me.Panel1.Controls.Add(mcheck(i))
        AddHandler mcheck(i).CheckedChanged, AddressOf LlamadaCheckBox
        i += 1
        pos += 20
    Next

End Sub

由于面板内的失真效果,我想更改滚动行数,如果我像 Windows SO 属性的图像那样使用“一个 scoll 页”或“一次滚动 10 个”,那么我可以修复它!

【问题讨论】:

  • 您想将Mouse Properties -> Wheel -> The following number of lines at a time 更改为您程序中的任意号码?
  • 我有一个面板,当我在我的应用程序中使用鼠标滚轮时,我想滚动“X”行,例如向下或向上 20 行,谢谢您的评论和您的回答
  • 现在它根本不滚动,对吗? (这是我正在经历的,即默认面板不会在 MouseWheel 上滚动)
  • 您正在尝试模仿CheckedListBox 的功能。请不要重新发明轮子,而是使用原生组件。从长远来看,你的头痛会少很多。

标签: vb.net scroll scrollbar mouseevent mousewheel


【解决方案1】:

MouseEventArgs 对象有一个属性Delta 来确定鼠标滚轮的滚动量。此外,还有SystemInformation.MouseWheelScrollLines。有一个名为 WHEEL_DELTA = 120 的电流常量,它反映了每个鼠标滚轮滴答声添加的增量。

所以一个好的定义是:

Dim numberOfTextLinesToMove As Integer = CInt(e.Delta * SystemInformation.MouseWheelScrollLines / 120)

来源:Control.MouseWheel Event on MSDN

【讨论】:

  • 对不起,我是初学者,我试过用它但我不知道怎么做,你能给我一个例子吗?
【解决方案2】:

无论SystemInformation.MouseWheelScrollLines 中的内容如何,​​您都可以使用SendMessage 滚动任意行数。 MouseWheel event does not occur for a Panel。所以我在 TextBox 上进行了测试:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
               (ByVal handle As IntPtr, ByVal wMsg As Integer,
                ByVal wParam As Integer, ByVal lParam As Integer) As Integer

向上滚动一行:

SendMessage(TextBox1.Handle, &HB6, 0, -1)

向下滚动一行:

SendMessage(TextBox1.Handle, &HB6, 0, 1)

最后一个参数是行数,符号表示方向。负 - 上,正 - 下。

您应该能够覆盖/抑制鼠标滚轮处理并插入这两个语句,具体取决于传递的 delta 值的符号。

【讨论】:

  • 谢谢,我已尝试与您一起发送该消息示例,但我仍在滚动 5 条默认行...也许我做错了什么
  • @ElektroHacker:可能是您没有取消原始活动。但请考虑CheckedListBox。它应该可以解决您的大部分问题。
  • 我无法使选中的列表框透明,并且它没有用于添加滚动条的 AutoScroll(我不知道如何手动添加),无论如何谢谢
  • @ElektroHacker:要使其透明,请参阅Transparent ListBox on CodeProject。 CheckedListBox 继承自 ListBox,因此应该使用相同的技术。如果内容需要滚动,滚动条会自动出现。或者设置ScrollAlwaysVisible = True一直显示。
【解决方案3】:

您可以查看 MouseWheel 事件的 MSDN 示例。他们建议像这样,您可以通过将 SystemInformation.MouseWheelScrollLines 替换为您要滚动的行数来更改更改的数量。

来自链接:

Private Sub panel1_MouseWheel(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles panel1.MouseWheel
        ' Update the drawing based upon the mouse wheel scrolling. 
    Dim numberOfTextLinesToMove As Integer = CInt(e.Delta * SystemInformation.MouseWheelScrollLines / 120)
    Dim numberOfPixelsToMove As Integer = numberOfTextLinesToMove * fontSize

    If numberOfPixelsToMove <> 0 The
        Dim translateMatrix As New System.Drawing.Drawing2D.Matrix()
        translateMatrix.Translate(0, numberOfPixelsToMove)
        mousePath.Transform(translateMatrix)
    End If
    panel1.Invalidate()
End Sub

另一个例子:

我关闭 AutoScroll 是因为它似乎想至少给你一个最小的系统滚动线。我不得不进行一些检查,以防止不断滚动通过范围。试试看它是否适合你。

Private Sub panel1_MouseWheel(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseWheel
    Dim numberOfTextLinesToMove As Integer = CInt(e.Delta * 20 / 120)
    Dim numberOfPixelsToMove As Integer = numberOfTextLinesToMove * mcheck(0).Font.Size

    If numberOfPixelsToMove <> 0 Then
        If (numberOfPixelsToMove > 0) Then
            If (mcheck(0).Top >= 0) Then Exit Sub
        Else
            If (mcheck(mcheck.Length - 1).Top) <= Panel1.Height Then Exit Sub
        End If

        TranslateCheckboxes(numberOfPixelsToMove)
    Else
        Exit Sub
    End If
    Panel1.Invalidate()
End Sub

Private Sub TranslateCheckboxes(pixels As Integer)
    For x = 0 To mcheck.Length - 1
        mcheck(x).Top += pixels
    Next
End Sub

【讨论】:

  • fontSizemousePath 未声明?
  • @LarsTech:是的,我知道 - 只是试图将引用的文章与问题相匹配以在一个孤立的项目中重现(不绘制鼠标路径) - 到目前为止没有运气。
  • 对不起,我是初学者,我试过用它,但我不知道怎么做。我已经定义了字体大小和鼠标路径,就像在 msdn 的示例中一样,我已经更改了整数值但是......什么都没有
  • @electrohacker 尝试将您想要滚动的内容发布到您的面板中,他们的示例是鼠标绘图示例。不幸的是,我不会在几个小时内通过电脑回来
  • @Mark Gall 谢谢你的时间,我已经更新了我的问题,添加了更多信息
猜你喜欢
  • 2017-09-03
  • 2011-11-09
  • 1970-01-01
  • 2011-09-29
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多