ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何给ListView添加滚动条事件?

如何给ListView添加滚动条事件?

作者:绿色风 分类: 时间:2022-08-17 浏览:87
楼主
amulee
Q:如何给ListView添加滚动条事件?
A:ListView控件是不具备滚动条事件的,但是可以通过子类化来捕捉滚动条事件从而实现事件程序的触发。
在Windows的机制中,各项操作都是通过消息来发送指令完成的。
当单击ListView滚动条时,系统会自动发送相应的消息(长整形变量)给指定窗口函数,该函数根据发送来的消息得知不同的操作,从而进行相应的操作。
子类化就是在消息发送给默认的窗口函数之前拦截这个消息,编程者可以利用发送来的消息决定自己的操作。

本例就是通过子类化拦截ListView发送来的消息,当消息是处理垂直滚动条时,则调用自己定义的事件程序。
参考代码如下:
添加一个模块:
  1. '调用指定窗口函数的API函数定义
  2. Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
  3.         (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
  4.         ByVal wParam As Long, ByVal lParam As Long) As Long
  5. '设置Windows长参数的API函数定义
  6. Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  7.         (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  8. Public Const WM_VSCROLL As Long = &H115 '滚动条事件
  9. Public lpPrevWndProc As Long '存放原窗口函数句柄
  10. Public Const GWL_WNDPROC As Long = (-4) '指定替换原窗口函数常数
  11. '我们自己的窗口函数
  12. Public Function ListViewWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, _
  13.     ByVal wParam As Long, ByVal lParam As Long) As Long
  14.     '应用程序可在此截获所需的Windows消息加以处理
  15.     If uMsg = WM_VSCROLL Then   '消息为垂直滚动条发送来的则触发
  16.         '调用自定义的事件
  17.         Call UserForm1.ListView_VScroll(ByVal wParam)
  18.     End If
  19.     '调用原窗口函数,由原窗口函数处理Windows消息
  20.     ListViewWindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
  21. End Function
  22. Sub Test()
  23.     UserForm1.Show
  24. End Sub


窗体代码如下:
  1. Private Sub UserForm_Initialize()
  2.     Dim i As Integer
  3.     '添加数据
  4.     With ListView1
  5.         .ColumnHeaders.Add , , "Column 1"
  6.         .View = lvwReport
  7.         For i = 1 To 1000
  8.             .ListItems.Add , , "Item " & CStr(i)
  9.         Next
  10.     End With
  11.     '子类化
  12.     '设置ListView1的新窗口函数为ListViewWindowProc,将原窗口函数地址送lpPrevWndProc
  13.     lpPrevWndProc = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, AddressOf ListViewWindowProc)
  14. End Sub
  15. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  16.     Dim Temp As Long
  17.     '恢复原窗口函数
  18.     Temp = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, lpPrevWndProc)
  19. End Sub
  20. '自定义的滚动条事件
  21. Sub ListView_VScroll(ByVal Direction As Long)
  22.     Select Case Direction
  23.         Case 3, 1
  24.             MsgBox "向下滚动"
  25.         Case 0, 2
  26.             MsgBox "向上滚动"
  27.     End Select
  28. End Sub


附件下载:
用子类化实现ListView滚动条事件.rar
2楼
亡者天下
过来学一下

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap