已有23人关注
DataGrid控件如何支持鼠标滚轮
发表在VB答疑区 2010-04-30
是否精华
版块置顶:
用VB6.0开发软件,其中引用DataGrid控件,显示大量数据,只能用边上滑杆,鼠标滚轮不起作用,使用不是很方便,请教专家们,用什么办法可以解决使用鼠标滚轮,数据跟着滚轮向下移动。如能帮助解决,特表示万分感谢!
                                                 上海读者:潘志磊
                                                    2010-4-30
   电子信箱:pan_zhilei@163.com
分享到:
精彩评论 3
vbsoldier
学分:0 LV1
2010-05-04
沙发
您好,请参考以下代码。

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H20A

Public lpWndProc As Long

Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End Sub

Public Sub UnHook(hwnd As Long)

SetWindowLong hwnd, GWL_WNDPROC, lpWndProc '御掉Hook,还原原始窗口函数

End Sub

Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'处理WM_MOUSEWHEEL消息的窗口函数

If uMsg = WM_MOUSEWHEEL Then
Dim wzDelta As Integer
wzDelta = HIWORD(wParam)

If Sgn(wzDelta) = 1 Then
DatabaseForm.DataGrid.Scroll 0, -1
Else
DatabaseForm.DataGrid.Scroll 0, 1
End If

End If

WindowProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam)

End Function

Public Function HIWORD(MsgParam As Long) As Integer
'取出32位值的高16位
HIWORD = (MsgParam And &HFFFF0000) \ &H10000
End Function

Form里的代码:

Private Sub Form_Load()
Hook DataGrid.hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnHook DataGrid.hwnd
End Sub

panzhilei
学分:0 LV1
TA的每日心情
伤心
2023-11-16 20:51:59
2010-05-07
板凳
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
您好,请参考以下代码。

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H20A

Public lpWndProc As Long

Public Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End Sub

Public Sub UnHook(hwnd As Long)

SetWindowLong hwnd, GWL_WNDPROC, lpWndProc '御掉Hook,还原原始窗口函数

End Sub

Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'处理WM_MOUSEWHEEL消息的窗口函数

If uMsg = WM_MOUSEWHEEL Then
Dim wzDelta As Integer
wzDelta = HIWORD(wParam)

If Sgn(wzDelta) = 1 Then
DatabaseForm.DataGrid.Scroll 0, -1
Else
DatabaseForm.DataGrid.Scroll 0, 1
End If

End If

WindowProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam)

End Function

Public Function HIWORD(MsgParam As Long) As Integer
'取出32位值的高16位
HIWORD = (MsgParam And &HFFFF0000) \ &H10000
End Function

Form里的代码:

Private Sub Form_Load()
Hook DataGrid.hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnHook DataGrid.hwnd
End Sub


[/FIELDSET]

回复:
   我虽然学习研究了几年,但绝对不是高手,上面代码,我放到系统中,这要点击这个窗口,系统就立即关闭.不知是何原因.特请教.
caocaocao
学分:0 LV1
TA的每日心情
2
2022-08-28 08:49:58
2010-09-29
地板
听别人说vb简单,简单到一学就会,后来我学了才发现vb超难,导致没人敢充当高手,除非他比微软还牛叉
首页上一页 1 下一页尾页 3 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照