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

「已注销」 2009-04-20 04:00:17
怎样用鼠标滚轮来滚动某个滚动条?比如现在有一个Vscroll,想通过鼠标滚轮来控制滚动条的滑块移动。代码怎么写?
...全文
529 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






VB6编辑器 和 VBA编辑器 (Office 中的VB编辑器)都不支持鼠标滚动。每次想看其它页的代码时,习惯性的滚动鼠标滚轮,居然没有半点反应——最好只好把鼠标移动到滚动上去拖……这样操作对于习惯了使用鼠标滚轮的我来说实在太痛苦了;虽然在某些系统下安装某些鼠标的驱动程序也可以滚动(比如我在Win2K在安装过罗技的鼠标驱动,可以滚动了),但是不是所有的系统下都可行。  下载补丁后,直接双击,将其解压到某个目录,比如 C:\Program Files\VB6MouseWheel(建议解压缩到VB的安装目录下,或者解压后拷贝到VB的安装目录下)。解压后会有如下一些文件: 代码源文件: EULA.txt Main.bas VB6IDEMouseWheelAddin.vbp 生成文件: VB6IDEMouseWheelAddin.dll 注册插件文件: VBA Mouse Wheel Fix.reg   VB6MouseWheel 是以VB插件的方式运行的。刚才下载运行的那个安装程序并没有对其进行注册,所以现在还需要手工注册一下:   1. 打开“命令提示符”进入到 DOS 窗口中,进入到 VB6MouseWheel 的安装目录,运行 regsvr32 VB6IDEMouseWheelAddin.dll 将这个dll 注册到系统中。   2. 双击 VBA Mouse Wheel Fix.reg 文件,将其导入到注册表。   3. 打开 VB6 或者 VBA 编辑器,打开它的外接程序管理器,会看到列表里出现了“MouseWheel Fix”这一项。选择它并将其设置为“加载的”和“启动时加载”。   现在再试试,VB6/VBA 编辑器中已经可能使用鼠标滚轮滚动代码了!
VB6编辑器 和 VBA编辑器 (Office 中的VB编辑器)都不支持鼠标滚动。每次想看其它页的代码时,习惯性的滚动鼠标滚轮,居然没有半点反应——最好只好把鼠标移动到滚动上去拖……这样操作对于习惯了使用鼠标滚轮的来说实在太痛苦了;虽然在某些系统下安装某些鼠标的驱动程序也可以滚动(比如我在Win2K在安装过罗技的鼠标驱动,可以滚动了),但是不是所有的系统下都可行。 实际上,MS 已经提供了补丁。 对补丁直接双击,将其解压到某个目录,比如 C:\Program Files\VB6MouseWheel(建议解压缩到VB的安装目录下,或者解压后拷贝到VB的安装目录下)。解压后会有如下一些文件: 代码源文件: EULA.txt Main.bas VB6IDEMouseWheelAddin.vbp 生成文件: VB6IDEMouseWheelAddin.dll 注册插件文件: VBA Mouse Wheel Fix.reg VB6MouseWheel 是以VB插件的方式运行的。刚才下载运行的那个安装程序并没有对其进行注册,所以现在还需要手工注册一下:   1. 打开“命令提示符”进入到 DOS 窗口中,进入到 VB6MouseWheel 的安装目录,运行 regsvr32.exe VB6IDEMouseWheelAddin.dll 将这个dll 注册到系统中。   2. 双击 VBA Mouse Wheel Fix.reg 文件,将其导入到注册表。   3. 打开 VB6 或者 VBA 编辑器,打开它的外接程序管理器,会看到列表里出现了“MouseWheel Fix”这一项。选择它并将其设置为“加载的”和“启动时加载”。   现在再试试,VB6/VBA 编辑器中已经可能使用鼠标滚轮滚动代码了! 嘿嘿,爽吧!

7,765

社区成员

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

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