我自己做了一个控件,然后把它放到了窗体中的PictureBox控件当中。一切运行正常且良好,但是运行起来这个控件在窗体中比较多,为了用户能够浏览到下面的部分,我没有办法只能在PictureBox控件旁边加上了一个VScrollBar控件,然后写代码:
Picture1.Top = -VScroll1.Value就想当拉动这个VScrollBar控件的时候,PictureBox控件能够移动显示出下面的需要浏览的控件请问高手,怎么样才能使鼠标滚轮让这个VScrollBar控件向下拉动实现我的功能???拜求拜求!!!!!!

解决方案 »

  1.   

    Private Sub Form_Load()
        lngPreProc = SetWindowLong(Picture1.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Picture1.hwnd, GWL_WNDPROC, lngPreProc
    End Sub
    =======================================================================
    模块内容:
    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 lngPreProc As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        On Error Resume Next
        If uMsg <> 522 Then
            WindowProc = CallWindowProc(lngPreProc, hwnd, uMsg, wParam, lParam)
        Else '滚轮
            On Error Resume Next
            With Form1.VScroll1
                If wParam > 0 Then
                    .Value = .Value - .SmallChange
                Else
                    .Value = .Value + .SmallChange
                End If
            End With
        End If
    End Function
      

  2.   

    ...标准处理就是用subclass控件内subclassing可以参考hookmenu的源代码
      

  3.   

    其实只要鼠标滚轮让这个VScrollBar控件滚动就应该实现功能了
      

  4.   

    我试验是可以的,鼠标滚轮可以滚动VScrollBar
    说说你那里是怎么不行?表现是什么?
      

  5.   

    用两个PictureBox来实现
    第一个Pic1设为你想要在FORM中显示的大小
    第二个Pic2做大一点,大到能全部显示你要显示的所有控件(你的控件就放在Pic2中)
    然后把Pic2放在Pic1中,
    最后用Pic2.Top = -VScroll1.Value
    你试试看
      

  6.   

    杰西你的方法我试过了,然后我再用上了蚜虫的代码,然后滚动滚轮看到Picture1微微地再跟着鼠标滚轮在上下动,但是,是很小很小的范围...还有为什么要达到可以显示所有控件呢?
      

  7.   

    你需要设置VScroll的LargeChange及SmallChange两个属性的值你要的是支持滑轮刚刚没有看清题,等下我再给你找点资料
      

  8.   

    此方法与yachong(蚜虫)的类似'模组中
    Option ExplicitPrivate Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private 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
    Private Const GWL_WNDPROC   As Long = (-4)
    Private Const WM_MOUSEWHEEL As Long = &H20A
    Private m_OldWindowProc As LongPublic Sub HookWheel()
        m_OldWindowProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf pvWindowProc)
    End SubPrivate Function pvWindowProc(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 Is > 0
                            SendKeys "{Up}"
                        Case Else
                            SendKeys "{Down}"
                        End Select
        End Select
        pvWindowProc = CallWindowProc(m_OldWindowProc, hWnd, wMsg, wParam, lParam)
    End Function
    '窗体中
    Option ExplicitPrivate Sub Form_Load()
       Call HookWheel
    End SubPrivate Sub Pic2_Click()
       VScroll1.SetFocus
    End Sub