29
Октябрь
2009
Прокрутка Grid’ов и ScrollBar’ов колесом мыша
Прокрутка Grid’ов и ScrollBar’ов колесом мыша.
Код применим для «DataGrid», «DBGrid», «MSHFlexGrid», «MSFlexGrid», «VScrollBar», «HScrollBar»
Код формы:
Private Sub Form_Load() Call Hook(Me.hWnd) End Sub Private Sub Form_Unload(Cancel As Integer) Call UnHook(Me.hWnd) End Sub
Private Sub Form_Load() Call Hook(Me.hWnd) End Sub Private Sub Form_Unload(Cancel As Integer) Call UnHook(Me.hWnd) End Sub
Код модуля:
Option Explicit Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_WNDPROC = -4 Private Const WM_MOUSEWHEEL = &H20A Private lpPrevWndProc As Long Public Sub Hook(hWnd As Long) lpPrevWndProc = SetWindowLongA(hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub UnHook(hWnd As Long) Call SetWindowLongA(hWnd, GWL_WNDPROC, lpPrevWndProc) End Sub Private Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long On Error GoTo xErr If uMsg = WM_MOUSEWHEEL Then Dim Wheel As Long, iRow As Long Dim Contr As Object If wParam < 0 Then Wheel = -1 If wParam > 0 Then Wheel = 1 Set Contr = Screen.ActiveForm.ActiveControl Select Case TypeName(Contr) Case "MSHFlexGrid", "MSFlexGrid" iRow = Contr.TopRow If Not ((iRow = 1 And Wheel = 1) Or (iRow = Contr.Rows - 1 And Wheel = -1)) Then Contr.TopRow = iRow - Wheel End If Case "DataGrid", "DBGrid" Contr.Scroll 0, Wheel * -1 Case "VScrollBar", "HScrollBar" iRow = Contr.Value If Not ((iRow = Contr.Min And Wheel = 1) Or (iRow = Contr.Max And Wheel = -1)) Then Contr.Value = iRow - Wheel End If End Select Set Contr = Nothing Else WindowProc = CallWindowProcA(lpPrevWndProc, hWnd, uMsg, wParam, lParam) End If xErr: End Function