MSflexgrid支持鼠标滚轮事件 运行时提示错误 Row数值无效 什么原因?

fangshengwen 2008-05-01 06:38:15
MSflexgrid支持鼠标滚轮事件

下程序放在一个公共模块中,
在窗体中的form_load事件中 写 HookWheel me.hwnd
在窗体中的form_unload事件中 写 UnHookWheel me.hwnd
在表格的GotFocus事件中 set CtlWheel=MSFlexGrid1
在表格的LostFocus事件中 set CtlWheel=Nothing

Option Explicit

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


Private m_OldWindowProc As Long

Public CtlWheel As Object

Public Sub HookWheel(ByVal frmHwnd)

m_OldWindowProc = SetWindowLong(frmHwnd, GWL_WNDPROC, AddressOf pvWindowProc)
End Sub

Public Sub UnHookWheel(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)

End Sub

Private Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo errH

Select Case wMsg

Case WM_MOUSEWHEEL
If Not CtlWheel Is Nothing Then
If TypeOf CtlWheel Is MSFlexGrid Then
With CtlWheel

Select Case wParam
Case Is > 0

If CtlWheel.TopRow > 0 Then
CtlWheel.TopRow = CtlWheel.TopRow - 1
End If

Case Else

CtlWheel.TopRow = CtlWheel.TopRow + 1

End Select
End With
End If

End If
End Select

errH:

pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function

运行时鼠标滚轮时提示,实时错误"30009" Row数值无效 红色那行是错误位置。
是什么原因呢?
...全文
255 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangshengwen 2008-05-04
  • 打赏
  • 举报
回复
谢谢各位了
watt 2008-05-04
  • 打赏
  • 举报
回复
应该判断一下CtlWheel.Rows的值

if CtlWheel.Rows-1>CtlWheel.TopRow then
CtlWheel.TopRow = CtlWheel.TopRow + 1
end if
yinweihong 2008-05-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/yinweihong/archive/2004/09/25/116638.aspx
daisy8675 2008-05-03
  • 打赏
  • 举报
回复
运行时鼠标滚轮时提示,实时错误"30009" Row数值无效 红色那行是错误位置。
//
你debug.print msflexgrid.row 看一下是不是在rows的允许范围内吧,实际运行并无问题.
daisy8675 2008-05-03
  • 打赏
  • 举报
回复
这段代码并没有问题,正常啊


看了下,好象也是网上的共享代码
蔡健常熟 2008-05-03
  • 打赏
  • 举报
回复
给你修改了下这个函数,替换下试看:

Private Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo errH

Select Case wMsg

Case WM_MOUSEWHEEL
If Not CtlWheel Is Nothing Then
If TypeOf CtlWheel Is MSFlexGrid Then
With CtlWheel
Select Case wParam
Case Is > 0

If CtlWheel.TopRow > 1 Then
CtlWheel.TopRow = CtlWheel.TopRow - 1
End If
Case Else
If CtlWheel.TopRow < CtlWheel.Rows - 1 Then
CtlWheel.TopRow = CtlWheel.TopRow + 1
End If
End Select
End With
End If

End If
End Select

errH:

pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function
舉杯邀明月 2008-05-03
  • 打赏
  • 举报
回复
Up..........

1,217

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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