DataGrid控件如何才能支持鼠标滚轮呢?谢谢!

yudengchang 2010-07-16 03:45:20
DataGrid本身不支持鼠标滚轮功能,必须要通过API才能实现。

下面代码,无论你的窗体有多少个DataGrid控件,只要是获得焦点的就支持鼠标滚轮,而且还支持MSHFlexGrid控件鼠标滚轮!

代码如下:

一、先建一个模块(Module1),把以下代码贴上:

Option Explicit

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
Private Const GWL_WNDPROC = (-4)
Private Const WM_MOUSEWHEEL = &H20A
Private 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

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

If uMsg = WM_MOUSEWHEEL Then
wzDelta = HIWORD(wParam)
If Sgn(wzDelta) = 1 Then
If TypeOf Screen.ActiveControl Is DataGrid Then Screen.ActiveControl.Scroll 0, -1
Else
If TypeOf Screen.ActiveControl Is DataGrid Then Screen.ActiveControl.Scroll 0, 1
End If

If TypeOf Screen.ActiveControl Is MSHFlexGrid Then
If wzDelta > 0 Then
If Screen.ActiveControl.TopRow > 1 Then
If Screen.ActiveControl.TopRow < 1 Then
Screen.ActiveControl.TopRow = 1
Else
Screen.ActiveControl.TopRow = Screen.ActiveControl.TopRow - 1
End If
End If
Else
If Screen.ActiveControl.TopRow < Screen.ActiveControl.Rows Then
Screen.ActiveControl.TopRow = Screen.ActiveControl.TopRow + 1
End If
End If
End If
End If

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

End Function

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

二、在工程调用函数:

Private Sub Form_Load()
Call Hook(Me.hwnd)
End Sub

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

注:DataGrid在编辑状态下是不能滚动的,必须在选择(某行)状态下才能滚动。

※※※以上的方法在vb.net中怎么实现?请高人指点,Screen.ActiveControl 对应的VB.net怎么修改。
...全文
251 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
大刘0417 2010-08-04
  • 打赏
  • 举报
回复
潜伏中,只帮顶!
脾气不坏 2010-08-02
  • 打赏
  • 举报
回复
控件大小固定后不是会自动添加滚动条吗?
应该就支持鼠标滚动了
捷哥1999 2010-08-02
  • 打赏
  • 举报
回复
你确认.net 自己的datagridview不支持滚轮?
捷哥1999 2010-08-02
  • 打赏
  • 举报
回复
datagrid不支持滚轮?
zhykhld 2010-08-02
  • 打赏
  • 举报
回复
.Net控件自己支持鼠标滚轮,把你的这些代码删除就行了
yudengchang 2010-07-30
  • 打赏
  • 举报
回复
呵呵,我也想呀,但是怎么修改以上的代码呀。期待高人的出现。。。。。。。。。。。。。。。。
ratc 2010-07-21
  • 打赏
  • 举报
回复
还是换.net下的表格控件吧
yudengchang 2010-07-20
  • 打赏
  • 举报
回复
大家可能看错了,我上面的不是.net下的,我想用.net来实现。拜托各位了。
Screen.ActiveControl 在.net里面怎么对应?
sunrisehy2003 2010-07-20
  • 打赏
  • 举报
回复
楼主的就是答案。
楼主不是在提问题,是在给大家共享资料。真是好人!
czqq311 2010-07-20
  • 打赏
  • 举报
回复
太好了
yudengchang 2010-07-20
  • 打赏
  • 举报
回复
楼上的怎么解决的?为什么不给答案呀?你这也算回答吗?这样得不到分的。
yudengchang 2010-07-20
  • 打赏
  • 举报
回复
我用的是vs.net2008,我的上面Screen.ActiveControl 不认识,难道是我的版本高的问题?不应该呀
allanli 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yudengchang 的回复:]

大家可能看错了,我上面的不是.net下的,我想用.net来实现。拜托各位了。
Screen.ActiveControl 在.net里面怎么对应?
[/Quote]

不知道你的DataGrid是.Net什么版本,我的VS.NET2003的DataGrid支持鼠标滚轮滚动哦
不过也是需要点击DataGrid的某一行后才能滚动的
月下狂心 2010-07-19
  • 打赏
  • 举报
回复
我也遇到过这个问题,终于解决了
xlh0053 2010-07-19
  • 打赏
  • 举报
回复
虽然还没用到,但是早晚会用到,顶

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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