要实例
如何设置外部窗口的滚动条位置,包括垂直滚动条和水平滚动条,
之后根据滚动条位置,刷新窗口内容

解决方案 »

  1.   

    SBM_SETSCROLLINFO以后,鼠标移到窗口中,滚动条又回到原来的位置了
    然后怎么根据滚动条位置,刷新窗口内容
      

  2.   

    顶呀顶呀,救命啊,up~upupupupup~~~~~~~
      

  3.   

    是不是手工操作的鼠标已经按下了?用 ReleaseCapture 释放。
      

  4.   

    使用 Hscroll Vscroll 先设定好两个的 MAX 再用它们的 Change事件
      

  5.   

    不懂怎么用SBM_SETSCROLLINFO
    我试了如下代码,但是鼠标移到窗口中,滚动条又回到原来的位置了。。Option Explicit
    '滚动条信息结构体
    Public Type SCROLLINFO
        cbSize As Long
        fMask As Long
        nMin As Long
        nMax As Long
        nPage As Long
        nPos As Long
        nTrackPos As Long
    End Type
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function GetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long
    Public Declare Function SetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpcScrollInfo As SCROLLINFO, ByVal bool As Boolean) As Long
    Public Const SIF_RANGE = &H1
    Public Const SIF_PAGE = &H2
    Public Const SIF_POS = &H4
    Public Const SIF_ALL = SIF_RANGE Or SIF_PAGE Or SIF_POS
    Public Const SB_HORZ = 0
    Public Const SB_VERT = 1
    Public Const SB_CTL = 2
    Public Const WM_HSCROLL = &H114
    Public Const WM_VSCROLL = &H115
    Public Const SBM_SETSCROLLINFO = 233Public Const SB_LINEUP = 0
    Public Const SB_LINEDOWN = 1
      

  6.   


    Option ExplicitPrivate Sub Command1_Click()
      Dim si As SCROLLINFO
      si.cbSize = Len(si)
      si.fMask = SIF_POS
      GetScrollInfo &H2501FC, SB_VERT, si
      si.nPos = 20
      SetScrollInfo &H2501FC, SB_VERT, si, True
      'SendMessage &H80250, WM_VSCROLL, SB_LINEUP, 0
      'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0
      'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si
    End Sub
      

  7.   

    马马虎虎自己解决了Option ExplicitPrivate Sub Command1_Click()
      Dim si As SCROLLINFO, ScrollPos As Long, Distance As Long, PageRoute As Long, LineRoute As Long, i As Long
      Dim MyHwnd As Long
      MyHwnd = &H5B026C
      si.cbSize = Len(si)
      si.fMask = SIF_ALL
      GetScrollInfo MyHwnd, SB_VERT, si
      ScrollPos = CLng(InputBox("请输入需要滚动到的位置!"))
      If ScrollPos < si.nMin Or ScrollPos > si.nMax Then
        MsgBox "超出滚动范围"
        Exit Sub
      End If
      'si.nPos = 20
      'SetScrollInfo &H5B026C, SB_VERT, si, True
      Distance = ScrollPos - si.nPos
      PageRoute = Abs(Distance \ si.nPage)
      LineRoute = Abs(Distance Mod si.nPage)
      Select Case Distance
        Case Is > 0
          For i = 1 To PageRoute
            SendMessage MyHwnd, WM_VSCROLL, SB_PAGEDOWN, 0
          Next i
          For i = 1 To (LineRoute + PageRoute)
            SendMessage MyHwnd, WM_VSCROLL, SB_LINEDOWN, 0
          Next i
        Case Is < 0
          For i = 1 To PageRoute
            SendMessage MyHwnd, WM_VSCROLL, SB_PAGEUP, 0
          Next i
          For i = 1 To (LineRoute + PageRoute)
            SendMessage MyHwnd, WM_VSCROLL, SB_LINEUP, 0
          Next i
        End Select
        GetScrollInfo MyHwnd, SB_VERT, si
        MsgBox "期望值:" & ScrollPos & vbCrLf & "实际值:" & si.nPos
      'SendMessage &H5B026C, WM_VSCROLL, SB_LINEUP, 0
      'SendMessage &H80250, WM_VSCROLL, SB_LINEDOWN, 0
      'SendMessage &H80250, SBM_SETSCROLLINFO, 0, si
    End Sub