使用以下脚本能够实现DataGrid支持鼠标滚轴,但需要选中一行才能生效,若某个单元格选中则无法滚动,请问单元格选中如何才能实现DataGrid支持鼠标滚轴,另外我下面的脚本有时滚动溢出,这又是为什么?Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MOUSEWHEEL = &H20APublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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 LongPublic Oldwinproc As Long
Public Function FlexScroll(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864320
'向下滚
frmLogQuery.dgrResults.Scroll frmLogQuery.dgrResults.Col, 3
Case 7864320
'向上滚
frmLogQuery.dgrResults.Scroll frmLogQuery.dgrResults.Col, -3
End Select
End Select
FlexScroll = CallWindowProc(Oldwinproc, hwnd, wMsg, wParam, lParam)
End FunctionPrivate Sub dgrResults_GotFocus()
Oldwinproc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf FlexScroll
End Sub
Private Sub dgrResults_LostFocus()
SetWindowLong Me.hwnd, GWL_WNDPROC, Oldwinproc
End Sub
Public Const WM_COMMAND = &H111
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MOUSEWHEEL = &H20APublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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 LongPublic Oldwinproc As Long
Public Function FlexScroll(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864320
'向下滚
frmLogQuery.dgrResults.Scroll frmLogQuery.dgrResults.Col, 3
Case 7864320
'向上滚
frmLogQuery.dgrResults.Scroll frmLogQuery.dgrResults.Col, -3
End Select
End Select
FlexScroll = CallWindowProc(Oldwinproc, hwnd, wMsg, wParam, lParam)
End FunctionPrivate Sub dgrResults_GotFocus()
Oldwinproc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf FlexScroll
End Sub
Private Sub dgrResults_LostFocus()
SetWindowLong Me.hwnd, GWL_WNDPROC, Oldwinproc
End Sub
我以前的代码中再增加了用WindowFromPoint来判断鼠标指针是否在GRID上的代码.因为如果鼠标指针在窗体其他地方,滚动滚轮,如果此时也让GRID滚动.似乎不合适.