怎样用鼠标滚轮来滚动某个滚动条?

「已注销」 2009-04-20 04:00:17
怎样用鼠标滚轮来滚动某个滚动条?比如现在有一个Vscroll,想通过鼠标滚轮来控制滚动条的滑块移动。代码怎么写?
...全文
527 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-04-23
  • 打赏
  • 举报
回复
顶起
「已注销」 2009-04-23
  • 打赏
  • 举报
回复
Public Function Scroll(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864318 '按住右键并下滚滚轮
SendKeys "{PGDN}"
Case 7864322 '按住右键并上滚滚轮
SendKeys "{PGUP}"
End Select
End Select
Debug.Print "wParam " & wParam
Debug.Print "wMsg " & wMsg
Debug.Print "lParam " & lParam
Scroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
End Function

请问按键盘的按键为什么wParam、wMsg、lParam没有变化?比如按键盘上的字母。
「已注销」 2009-04-22
  • 打赏
  • 举报
回复
End Select
End Select
Debug.Print "wParam " & wParam
Debug.Print "wMsg " & wMsg
Debug.Print "lParam " & lParam

我是在两个end select下面写的Debug.Print,并且对鼠标操作都有显示。

按键盘的上下左右也有显示,但按ABCD等按键没显示。
VBToy 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 p7a41679d 的回复:]
谢谢VBToy,试了一下,按住右键并上下拨滚轮,分别是-7864318 7864322,效果实现了。可是为什么我对鼠标进行操作,立即窗口有显示,然而按键盘上的某些按键就没显示呢?
[/Quote]
把debug入在所有的select 之外,分别看一看wMsg,wParam,lParam有什么变化.
「已注销」 2009-04-22
  • 打赏
  • 举报
回复
谢谢VBToy,试了一下,按住右键并上下拨滚轮,分别是-7864318 7864322,效果实现了。可是为什么我对鼠标进行操作,立即窗口有显示,然而按键盘上的某些按键就没显示呢?
VBToy 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 p7a41679d 的回复:]
再问一下各位:

如果按下了鼠标右键并转动鼠标滚轮就能让滚动条动,如果只是转动鼠标滚轮就不执行操作。

请问这个应该怎么弄?我加了Button=2不行。
[/Quote]
如其授人以鱼,不如授人以渔。在代码中加入debug,看一看消息参数是怎么变化的:
Select Case wParam
Case -7864320 '向下滚
SendKeys "{PGDN}"
Case 7864320 '向上滚
SendKeys "{PGUP}"
End Select
Debug.Print wParam '加入debug

这样,在“按下了鼠标右键并转动鼠标滚轮就能让滚动条动”的操作中,可以看到wParam的参数在上滚与下滚时的值分别是: 7864321和-7864319
通过这种方法,想怎么组合鼠标操作都可以找到了。楼主可以试着如何改动上面的代码,以得到自己要的效果。

「已注销」 2009-04-22
  • 打赏
  • 举报
回复
再问一下各位:

如果按下了鼠标右键并转动鼠标滚轮就能让滚动条动,如果只是转动鼠标滚轮就不执行操作。

请问这个应该怎么弄?我加了Button=2不行。
VBToy 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 p7a41679d 的回复:]
谢谢您回答,我很菜,不太理解您的代码。特别是CallWindowProc、GetWindowLong、SetWindowLong。请您较仔细地讲一下。
[/Quote]
在网上搜一下“VB 子类化”有很多这方面的介绍资料。
舉杯邀明月 2009-04-21
  • 打赏
  • 举报
回复
可惜把 .TabStop 属性设置成 False 好象就不会响应了。
但不设置成 False ,滚动框会闪烁,很难看~~~~~
晨山往事 2009-04-21
  • 打赏
  • 举报
回复
首先要懂得其原理.窗口在默认情况下对大多数消息作出处理,例如,你在文本框中按下键盘上A键就显示个A等,处理在"窗口过程"中进行.此时,我们要求额外处理WM_MOUSEWHELL消息来响应鼠标滚轮事件."窗口过程"是个系统回调函数,常见函数名如"WindowProc"等,楼上VBToy兄弟中的"Scroll"过程就是.在此过程中,VBToy用Select Case来选择消息,如下:
Case WM_MOUSEWHEEL
...
现在,需要把原有窗口过程取出(用GetWindowLong),记为Oldwinproc
,並賦給新的過程(即Scroll)用SetWindowLong
下面這句則是在不需要時將原窗口過程賦回:
SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc




「已注销」 2009-04-20
  • 打赏
  • 举报
回复
或者哪位知道,请回答一下。
「已注销」 2009-04-20
  • 打赏
  • 举报
回复
谢谢您回答,我很菜,不太理解您的代码。特别是CallWindowProc、GetWindowLong、SetWindowLong。请您较仔细地讲一下。
嗷嗷叫的老马 2009-04-20
  • 打赏
  • 举报
回复
顶.

就是子类化.
VBToy 2009-04-20
  • 打赏
  • 举报
回复
标准模块中
Option Explicit

Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MOUSEWHEEL = &H20A

Public Oldwinproc As Long

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long

Public Function Scroll(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864320
SendKeys "{PGDN}"
Case 7864320
SendKeys "{PGUP}"
End Select
End Select
Scroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
End Function

窗体中
Option Explicit

Private Sub HScroll1_Change()
Label1.Caption = HScroll1.Value '显示
End Sub

Private Sub HScroll1_GotFocus()
Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf Scroll
End Sub

Private Sub HScroll1_LostFocus()
SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc
End Sub






7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧