Option ExplicitPublic Const GWL_WNDPROC = (-4) Public Const WM_COPYDATA = &H4A Public Const WM_MOUSEWHEEL = &H20A Public Type COPYDATASTRUCT dwData As Long cbData As Long lpData As Long End TypePublic 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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Public prevWndProc As Long Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_MOUSEWHEEL Then With Form1.MSHFlexGrid1 If wParam = -7864320 Then .TopRow = .TopRow + 1'向下滚动 ElseIf wParam = 7864320 Then If .TopRow > 1 Then .TopRow = .TopRow - 1'向上滚动 End If End If End With Else WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam) End If End Function所在窗体:Private Sub Form_Load() '表格窗口消息 prevWndProc = GetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC) Call SetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC, AddressOf WndProc) End SubPrivate Sub Form_Unload(Cancel As Integer) '恢复窗口程序 Call SetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC, prevWndProc1) End Sub
or MSFlexGrid MouseWheel Supported http://blog.csdn.net/yinweihong/archive/2004/09/25/116638.aspx
请教在MSFlexGrid MouseWheel Supported中下列的在窗体中的代码要怎么调用才可以实现在GRID中滚动啊,传什么值啊?我是菜鸟啊,请举个例子啊好不好啊谢过先。 Private Sub Form_Load() Call WheelHook(Form1) End SubPrivate Sub Form_Unload(Cancel As Integer) Call WheelUnHook End Sub Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long) Dim NewValue As Long Dim Lstep As Single On Error Resume Next With MSFlexGrid1 Lstep = .Height / .RowHeight(0) Lstep = Int(Lstep) If Lstep < 10 Then Lstep = 10 End If If Rotation > 0 Then NewValue = .TopRow - Lstep If NewValue < 1 Then NewValue = 1 End If Else NewValue = .TopRow + Lstep If NewValue > .Rows - 1 Then NewValue = .Rows - 1 End If End If .TopRow = NewValue End With End Sub
Public Const WM_COPYDATA = &H4A
Public Const WM_MOUSEWHEEL = &H20A
Public Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End TypePublic 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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Public prevWndProc As Long
Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MOUSEWHEEL Then
With Form1.MSHFlexGrid1
If wParam = -7864320 Then
.TopRow = .TopRow + 1'向下滚动
ElseIf wParam = 7864320 Then
If .TopRow > 1 Then
.TopRow = .TopRow - 1'向上滚动
End If
End If
End With
Else
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End If
End Function所在窗体:Private Sub Form_Load()
'表格窗口消息
prevWndProc = GetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC)
Call SetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC, AddressOf WndProc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
'恢复窗口程序
Call SetWindowLong(MSHFlexGrid1.hWnd, GWL_WNDPROC, prevWndProc1)
End Sub
MSFlexGrid MouseWheel Supported
http://blog.csdn.net/yinweihong/archive/2004/09/25/116638.aspx
Private Sub Form_Load()
Call WheelHook(Form1)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call WheelUnHook
End Sub
Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long)
Dim NewValue As Long
Dim Lstep As Single On Error Resume Next With MSFlexGrid1
Lstep = .Height / .RowHeight(0)
Lstep = Int(Lstep)
If Lstep < 10 Then
Lstep = 10
End If
If Rotation > 0 Then
NewValue = .TopRow - Lstep
If NewValue < 1 Then
NewValue = 1
End If
Else
NewValue = .TopRow + Lstep
If NewValue > .Rows - 1 Then
NewValue = .Rows - 1
End If
End If
.TopRow = NewValue
End With
End Sub
这是一个标准的callback问题