有增做个一个对datagrid使用鼠标中键滚动的,也能用于msflexgrid,基中需要改变的地方都有说明: 窗体中有一datagrid,名为grdHistory: Private Sub Form_Load() ‘准备 ‘’’‘向grdHistory装载内容的代码 Hook Me.hwnd, grdHistory End Sub Private Sub Form_Unload(Cancel As Integer) UnHook Me.hwnd End Sub ‘标准模块中: Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Const GWL_WNDPROC = -4 Public Const SPI_GETWHEELSCROLLLINES = 104 Public Const WM_MOUSEWHEEL = &H20A Public WHEEL_SCROLL_LINES As Long
Global lpPrevWndProc As Long
Public Sub Hook(ByVal hwnd As Long, ByVal objGrid As DataGrid) lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
‘对于MSGFlexGrid,下面三行应更改 If WHEEL_SCROLL_LINES > objGrid.VisibleRows Then WHEEL_SCROLL_LINES = objGrid.VisibleRows End If End Sub
Public Sub UnHook(ByVal hwnd As Long) SetWindowLong hwnd, GWL_WNDPROC, lpPrevWndProc End Sub
Private Function WindowProc(ByVal hw As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim wKeys As Integer Dim wzDelta As Integer
Select Case uMsg Case WM_MOUSEWHEEL With frmHistory.grdHistory wKeys = LOWORD(wParam) wzDelta = HIWORD(wParam) '判断坐标是否在Form1.grdDataGrid窗口内 If wKeys = 16 Then '滚动键按下,水平滚动grdDataGrid ‘对于MSGFlexGrid,水平滚动可通过其改变其leftcol现实 If Sgn(wzDelta) = 1 Then .Scroll -1, 0 Else .Scroll 1, 0 End If Else '鼠标按下时垂直滚动 ‘对于MSGFlexGrid,水平滚动可通过其改变其toprow现实 If Sgn(wzDelta) = 1 Then .Scroll 0, 0 - WHEEL_SCROLL_LINES Else .Scroll 0, WHEEL_SCROLL_LINES End If End If End With
Case Else WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
Public Function HIWORD(LongIn As Long) As Integer ' 取出32位值的高16位 HIWORD = (LongIn And &HFFFF0000) \ &H10000 End Function
Public Function LOWORD(LongIn As Long) As Integer ' 取出32位值的低16位 LOWORD = LongIn And &HFFFF& End Function
窗体中有一datagrid,名为grdHistory:
Private Sub Form_Load()
‘准备
‘’’‘向grdHistory装载内容的代码
Hook Me.hwnd, grdHistory
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHook Me.hwnd
End Sub
‘标准模块中:
Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Const GWL_WNDPROC = -4
Public Const SPI_GETWHEELSCROLLLINES = 104
Public Const WM_MOUSEWHEEL = &H20A
Public WHEEL_SCROLL_LINES As Long
Global lpPrevWndProc As Long
Public Sub Hook(ByVal hwnd As Long, ByVal objGrid As DataGrid)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
'获取"控制面板"中的滚动行数值
Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
‘对于MSGFlexGrid,下面三行应更改
If WHEEL_SCROLL_LINES > objGrid.VisibleRows Then
WHEEL_SCROLL_LINES = objGrid.VisibleRows
End If
End Sub
Public Sub UnHook(ByVal hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, lpPrevWndProc
End Sub
Private Function WindowProc(ByVal hw As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long Dim wKeys As Integer
Dim wzDelta As Integer
Select Case uMsg
Case WM_MOUSEWHEEL
With frmHistory.grdHistory
wKeys = LOWORD(wParam)
wzDelta = HIWORD(wParam)
'判断坐标是否在Form1.grdDataGrid窗口内
If wKeys = 16 Then
'滚动键按下,水平滚动grdDataGrid
‘对于MSGFlexGrid,水平滚动可通过其改变其leftcol现实 If Sgn(wzDelta) = 1 Then
.Scroll -1, 0
Else
.Scroll 1, 0
End If
Else
'鼠标按下时垂直滚动
‘对于MSGFlexGrid,水平滚动可通过其改变其toprow现实
If Sgn(wzDelta) = 1 Then
.Scroll 0, 0 - WHEEL_SCROLL_LINES
Else
.Scroll 0, WHEEL_SCROLL_LINES
End If
End If
End With
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
Public Function HIWORD(LongIn As Long) As Integer
' 取出32位值的高16位
HIWORD = (LongIn And &HFFFF0000) \ &H10000
End Function
Public Function LOWORD(LongIn As Long) As Integer
' 取出32位值的低16位
LOWORD = LongIn And &HFFFF&
End Function