这几段代码来来自VB_IDE鼠标插件源码  
我想要问的是这哪两段代码的工作流程 和 每句的意思比如说 在 HookActiveCodePane 中  SetWindowLong 的 "AddressOf CodePaneProc" 传递的是什么  CodePaneProc 又是怎么接收的??如果要全代码的话可以回贴(我想应该都有把..呵呵...)如果回答的满意的话可以在加分... 希望高手们赐教..本人先在此谢谢了'######################################################################################################################
'##
'## 功能:  自定义消息处理函数(钩子函数)
'##
'## 参数:  hWnd    :窗体句柄
'##         nMsg    :消息
'##         wParam  :wParam参数
'##         lParam  :lParam参数
'##
'######################################################################################################################
Private Function CodePaneProc(ByVal hWnd As Long, ByVal nMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim TopLn     As Long
    Dim NumLines  As Long
    Dim ScrollTo  As Long    CodePaneOriginalProcPtr = GetProp(hWnd, PropName) 
    If CodePaneOriginalProcPtr Then 
        CodePaneProc = CallWindowProc(CodePaneOriginalProcPtr, hWnd, nMsg, wParam, lParam) 'call the original winproc to do what has to be done
        Select Case nMsg 'and now split on message type
            Case WM_KILLFOCUS 
            RemoveProp hWnd, PropName 'so remove the property
            SetWindowLong hWnd, IDX_WINDOWPROC, CodePaneOriginalProcPtr 
              HookActiveCodePane 'and finally hook the code pane which is now active
            Case WM_MOUSEWHEEL 'hah! there it is, that's what it's all about - the user fingers the mouse wheel
            If wParam And 1 Then 
                fSetOpts.Show vbModal 
                Unload fSetOpts
            Else 'NOT WPARAM...
                If Not VBInstance.ActiveCodePane Is Nothing Then '错误修复-我们有一个滚动的codepane
                    With VBInstance.ActiveCodePane
                        
                        TopLn = .TopLine
                        Select Case LinesToScroll
                            Case "-2"
                            NumLines = .CountOfVisibleLines * ScrollFraction
                            Case "-1"
                            NumLines = .CountOfVisibleLines - 1 
                            Case Else
                            NumLines = Abs(Val(LinesToScroll))
                            If NumLines >= .CountOfVisibleLines Then                                 NumLines = .CountOfVisibleLines - 1
                            End If
                        End Select
                        If NumLines < 1 Then 
                            NumLines = 1
                        End If
                        ScrollTo = TopLn - Sgn(wParam) * NumLines / ((wParam And &HFFFF&) \ 4 + 1)                         If ScrollTo = TopLn Then
                            ScrollTo = TopLn - Sgn(wParam)
                        End If
                        With .CodeModule
                            Select Case ScrollTo 
                                Case Is < 1
                                ScrollTo = 1
                                Case Is > .CountOfLines
                                ScrollTo = .CountOfLines
                            End Select
                        End With '.CODEMODULE
                        If Smooth Then
                            Do
                                TopLn = TopLn + Sgn(ScrollTo - TopLn)
                                Sleep 1
                                .TopLine = TopLn
                            Loop Until TopLn = ScrollTo
                        Else 'SMOOTH = FALSE/0
                            .TopLine = ScrollTo
                        End If
                    End With 'VBINSTANCE.ACTIVECODEPANE
                End If
            End If
        End Select
    End If
End Function
'#####################################################################################################
'## 功能:  当前代码窗体钩子函数
'#####################################################################################################
Public Sub HookActiveCodePane()
    hWndActiveCodePane = FindWindow("VbaWindow", vbNullString)  '先获取SDI窗体的hWnd
    If hWndActiveCodePane = 0 Then
        '否则为MDI模式,获取最上层的子窗体hWnd,类名为“MDIClient”
        hWndActiveCodePane = FindWindowEx(VBInstance.MainWindow.hWnd, 0, "MDIClient", vbNullString)
    End If
    If hWndActiveCodePane Then  '发现一个窗体(应该是代码窗体)
        SetProp hWndActiveCodePane, PropName, GetWindowLong(hWndActiveCodePane, IDX_WINDOWPROC) '存储当前窗体的默认消息处理函数地址指针到窗体的一个属性中(用于后期恢复用)
        SetWindowLong hWndActiveCodePane, IDX_WINDOWPROC, AddressOf CodePaneProc '指向自定义的消息处理函数
    End If
End Sub

解决方案 »

  1.   

    纠正一下是"VB_IDE支持鼠标滚轮插件源码"
      

  2.   

    这个是用windows API写的.是用的底层函数.
    如果想真正了解的话,需要学习API的.
    那个太复杂,是用C语言写的玩意儿.
      

  3.   

    这个是用windows API写的.是用的底层函数.
    如果想真正了解的话,需要学习API的.
    那个太复杂,是用C语言写的玩意儿.
      

  4.   

    我先不管它... 你帮我先解释一下HookActiveCodePane 中  SetWindowLong 的 "AddressOf CodePaneProc" 传递的是什么  CodePaneProc 又是怎么接收的?? 
      

  5.   

    HookActiveCodePane
    是一个钩子函数,也就是一个回调函数.
    http://www.codeuu.com/VB_IDE_MouseWheel_(Fixed)