使用以下脚本能够实现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

解决方案 »

  1.   

    我的的思路和你的不同,你不妨看看.如果表格只有一两行,当然不需要滚动,而表格行较多时,必然会出现滚动条,此时,响应滚轮事件向GRID发送WM_VSCROLL消息即可.我以前在MSHFLEX控件中就是这么做的.
      

  2.   

    少了几句话.因为GRID这些控件虽有滚动条却不支持鼠标滚轮,所以要自己响应滚轮消息,这个你已经做了,只需在Case WM_MOUSEWHEEL中发送WM_VSCROLL消息就可以了.也就不存在选中某单元格或行才能滚动的问题的.
    我以前的代码中再增加了用WindowFromPoint来判断鼠标指针是否在GRID上的代码.因为如果鼠标指针在窗体其他地方,滚动滚轮,如果此时也让GRID滚动.似乎不合适.
      

  3.   

    参考一下http://topic.csdn.net/u/20090420/16/2e728cea-5025-4661-bbb1-5bd4fbebf315.html,用pagedown向控件发消息。