新建一个模块,贴上下面的代码: Public 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 Const GWL_WNDPROC = (-4)Public Type tGridList frm As Form grid As MSFlexGrid grdHwnd As Long grdPreProc As Long End TypePrivate GridList() As tGridList Private nGridCount As LongPublic Function WindowProcGridHook(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim nIndex As Long nIndex = GetGridIndex(hwnd) If uMsg <> 522 Then WindowProcGridHook = CallWindowProc(GridList(nIndex).grdPreProc, hwnd, uMsg, wParam, lParam) Else '滚轮 On Error Resume Next With GridList(nIndex).grid Dim lngTopRow As Long, lngBottomRow As Long lngTopRow = 1 lngBottomRow = .Rows - 1 If wParam > 0 Then If Not .RowIsVisible(lngTopRow) Then .TopRow = .TopRow - 1 End If Else .TopRow = .TopRow + 1 End If End With End If End FunctionPublic Sub StartHook(frm As Form) Dim x As Variant Dim proc As Long For Each x In frm.Controls If TypeOf x Is MSFlexGrid Then nGridCount = nGridCount + 1 ReDim Preserve GridList(1 To nGridCount) As tGridList Set GridList(nGridCount).grid = x Set GridList(nGridCount).frm = frm GridList(nGridCount).grdHwnd = x.hwnd proc = SetWindowLong(x.hwnd, GWL_WNDPROC, AddressOf WindowProcGridHook) GridList(nGridCount).grdPreProc = proc End If Next End Sub Public Sub EndHook(frm As Form) Dim i As Long, j As Long, n As Long For i = nGridCount To 1 Step -1 If GridList(i).frm Is frm Then SetWindowLong GridList(i).grdHwnd, GWL_WNDPROC, GridList(i).grdPreProc n = n + 1 For j = i To nGridCount - n GridList(j) = GridList(j + 1) Next End If Next nGridCount = nGridCount - n End SubPrivate Function GetGridIndex(hwnd As Long) As Long Dim i As Long For i = 1 To nGridCount If GridList(i).grdHwnd = hwnd Then GetGridIndex = i Exit Function End If Next End Function然后在每个包含MSFlexGrid控件的窗体调用StartHook和EndHook这两个过程 例如: Private Sub Form_Load() StartHook Me End Sub Private Sub Form_Unload(Cancel As Integer) EndHook Me End Sub 这样就可以支持滚轮了
写API '支持滚轮鼠标API--------------------------------- Public Const GWL_WNDPROC = (-4) Public Const WM_COMMAND = &H111 Public Const WM_MBUTTONDOWN = &H207 Public Const WM_MBUTTONUP = &H208 Public Const WM_MOUSEWHEEL = &H20A
Public Oldwinproc 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 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 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 '向下滚 SendKeys "{PGDN}" Case 7864320 '向上滚 SendKeys "{PGUP}" End Select
End Select FlexScroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam) End Function '支持滚轮鼠标API--------------------------------- 然后在Form中填入下面两段代码: Private Sub GridList_GotFocus() Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf FlexScroll End SubPrivate Sub GridList_LostFocus() SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc End Sub 注:GridList就是MSFlexGrid
Public 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 Const GWL_WNDPROC = (-4)Public Type tGridList
frm As Form
grid As MSFlexGrid
grdHwnd As Long
grdPreProc As Long
End TypePrivate GridList() As tGridList
Private nGridCount As LongPublic Function WindowProcGridHook(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim nIndex As Long
nIndex = GetGridIndex(hwnd)
If uMsg <> 522 Then
WindowProcGridHook = CallWindowProc(GridList(nIndex).grdPreProc, hwnd, uMsg, wParam, lParam)
Else '滚轮
On Error Resume Next
With GridList(nIndex).grid
Dim lngTopRow As Long, lngBottomRow As Long
lngTopRow = 1
lngBottomRow = .Rows - 1
If wParam > 0 Then
If Not .RowIsVisible(lngTopRow) Then
.TopRow = .TopRow - 1
End If
Else
.TopRow = .TopRow + 1
End If
End With
End If
End FunctionPublic Sub StartHook(frm As Form)
Dim x As Variant
Dim proc As Long
For Each x In frm.Controls
If TypeOf x Is MSFlexGrid Then
nGridCount = nGridCount + 1
ReDim Preserve GridList(1 To nGridCount) As tGridList
Set GridList(nGridCount).grid = x
Set GridList(nGridCount).frm = frm
GridList(nGridCount).grdHwnd = x.hwnd
proc = SetWindowLong(x.hwnd, GWL_WNDPROC, AddressOf WindowProcGridHook)
GridList(nGridCount).grdPreProc = proc
End If
Next
End Sub
Public Sub EndHook(frm As Form)
Dim i As Long, j As Long, n As Long
For i = nGridCount To 1 Step -1
If GridList(i).frm Is frm Then
SetWindowLong GridList(i).grdHwnd, GWL_WNDPROC, GridList(i).grdPreProc
n = n + 1
For j = i To nGridCount - n
GridList(j) = GridList(j + 1)
Next
End If
Next
nGridCount = nGridCount - n
End SubPrivate Function GetGridIndex(hwnd As Long) As Long
Dim i As Long
For i = 1 To nGridCount
If GridList(i).grdHwnd = hwnd Then
GetGridIndex = i
Exit Function
End If
Next
End Function然后在每个包含MSFlexGrid控件的窗体调用StartHook和EndHook这两个过程
例如:
Private Sub Form_Load()
StartHook Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
EndHook Me
End Sub
这样就可以支持滚轮了
最好等到别的部分都测试完了,再加上StartHook和EndHook这两个过程的调用
调试的时候一定要注意随时保存工程^_^
'支持滚轮鼠标API---------------------------------
Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MOUSEWHEEL = &H20A
Public Oldwinproc 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 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 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 '向下滚
SendKeys "{PGDN}"
Case 7864320 '向上滚
SendKeys "{PGUP}"
End Select
End Select
FlexScroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
End Function
'支持滚轮鼠标API---------------------------------
然后在Form中填入下面两段代码:
Private Sub GridList_GotFocus()
Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf FlexScroll
End SubPrivate Sub GridList_LostFocus()
SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc
End Sub
注:GridList就是MSFlexGrid