我主要是想实现在MSFlexGrid控件中可以使用鼠标滚轮的功能,下面的代码在vb6.0中没有问题,但是在vb.net中有两处我不知道改怎么转换,请高手帮忙,谢谢了。modMouseWheel.bas
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
                          ByVal lpPrevWndFunc As Long, _
                          ByVal hWnd As Long, _
                          ByVal Msg As Long, _
                          ByVal Wparam As Long, _
                          ByVal Lparam As Long) As LongPrivate Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
                          ByVal hWnd As Long, _
                          ByVal nIndex As Long, _
                          ByVal dwNewLong As Long) As LongPublic Const MK_CONTROL = &H8
Public Const MK_LBUTTON = &H1
Public Const MK_RBUTTON = &H2
Public Const MK_MBUTTON = &H10
Public Const MK_SHIFT = &H4
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20ADim LocalHwnd As Long
Dim LocalPrevWndProc As Long
Dim MyForm As FormPrivate Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long    Dim MouseKeys As Long
    Dim Rotation As Long
    Dim Xpos As Long
    Dim Ypos As Long    If Lmsg = WM_MOUSEWHEEL Then
        MouseKeys = Wparam And 65535
        Rotation = Wparam / 65536
        Xpos = Lparam And 65535
        Ypos = Lparam / 65536
        MyForm.MouseWheel MouseKeys, Rotation, Xpos, Ypos
    End If
    WindowProc = CallWindowProc(LocalPrevWndProc, Lwnd, Lmsg, Wparam, Lparam)
End Function
Public Sub WheelHook(PassedForm As Form)    On Error Resume Next    Set MyForm = PassedForm
    LocalHwnd = PassedForm.hWnd
    LocalPrevWndProc = SetWindowLong(LocalHwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub WheelUnHook()
    Dim WorkFlag As Long    On Error Resume Next
    WorkFlag = SetWindowLong(LocalHwnd, GWL_WNDPROC, LocalPrevWndProc)
    Set MyForm = Nothing
End Sub
-------------------------------------------------------------------------------------
Add MsFlexGrid1 to Form1 and code below
Private Sub Form_Load()
    Call WheelHook(Form1)
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Call WheelUnHook
End Sub
Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long)
    Dim NewValue As Long
    Dim Lstep As Single    On Error Resume Next    With MSFlexGrid1
        Lstep = .Height / .RowHeight(0)
        Lstep = Int(Lstep)
        If Lstep < 10 Then
            Lstep = 10
        End If
        If Rotation > 0 Then
            NewValue = .TopRow - Lstep
            If NewValue < 1 Then
                NewValue = 1
            End If
        Else
            NewValue = .TopRow + Lstep
            If NewValue > .Rows - 1 Then
                NewValue = .Rows - 1
            End If
        End If
        .TopRow = NewValue
    End With
End Sub

解决方案 »

  1.   

    帮不了你,VB.NET不熟,偶用C#~
      

  2.   

    VB.NET中专门有个NativeWindow类来实现回掉过程
      

  3.   

    VB.Net中直接重载窗体的WndProc过程即可实现子类化
     Protected Overrides Sub WndProc(ByRef m As Message)
      
      Select Case (m.Msg)   Case WM_MOUSEWHEEL
        '子类化处理   
      End Select
    MyBase.WndProc(m)  '如果想屏蔽某条消息,则把该语句放到Case Else后。
    End Sub
      

  4.   

    6.0。。发展到.net技术,真叫人惊!
      

  5.   

    还是C#比较好用哦,支持支持,JFJF
      

  6.   

    在VB.net里面long要改成integer,还有你可以用benyfeifei(狒狒)的方法重载Overrides WndProc过程来代替SetWindowLong实现子类派生,在你的窗体类代码Classend class之间插入 Protected Overrides Sub WndProc(ByRef m As Message)End Sub,在把原来WindowProc里的代码修改一下搬过来就好。具体是哪两处错误不说出来怎么看的出来啊?