教各位一个关于滚动条的问题?
textbox.scrollbars 已设为 2 , 右边有了滚动条。1)有没有办法判断一个textbox右边的滚动条是否到了最下面(最底)?
2)可以指定滚动条的一个值。然后让滚动条移动吗?3)可以隐藏滚动条吗?

解决方案 »

  1.   

    ' 一个现成的函数,可以控制TextBox的滚动,放到标准模块中就可以调用了。Private Declare Function SendMessageBynum Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Const EM_LINESCROLL = &HB6' 控制文本框卷动
    ' hwnd 为文本框的句柄, Horizontal 为水平方向卷动的行数(可为负数), Vertical为垂直方向卷动的行数(可为负数)
    Function ScrollText(ByVal hwnd As Long, ByVal Horizontal As Long, ByVal Vertical As Long) As Boolean
    ScrollText = SendMessageBynum(hwnd, EM_LINESCROLL, Horizontal, Vertical)
    End Function
      

  2.   

    现在时有没有办法判断一个textbox右边的滚动条是否到了最下面(最底)?
    然后符合条件就重新滚动。 要不然这个api不可让其循环滚动。
      

  3.   

    ' 窗体代码:Option ExplicitPrivate Sub Command1_Click()
        ret = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Load()
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
        Text1.Text = Text1.Text & "djaflk;sajfkl;asdjfl;sdaf" & vbCrLf
    End Sub
    ' 标准模块:
    Option Explicit
    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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public ret As Long' SetWindowLong 的回调函数, 利用 Msg 拦截消息
    Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = 20 Then MsgBox "文本框中的垂直滚动条已经滚动到最下方."
    WindowProc = CallWindowProc(ret, hwnd, Msg, wParam, lParam)
    End Function
      

  4.   

    to goodname008(卢培培,想学好VB) :
        我怎么执行之后不会,text1不会滚动呢?
      

  5.   

    判断一个textbox右边的滚动条是否到了最下面(最底),马马虎虎。'声明
    Private Const SB_VERT = 1
    Private Const SIF_RANGE = &H1
    Private Const SIF_POS = &H4
    Private 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
    Private Declare Function GetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long'代码
    Private Sub Command1_Click()
      Dim si As SCROLLINFO, x As Long
      With Text1
        si.cbSize = LenB(si)
        si.fMask = SIF_RANGE Or SIF_POS
        GetScrollInfo .hwnd, SB_VERT, si
        If si.nPos = ((si.nMax - ((Me.ScaleY(.Height, Me.ScaleMode, vbPixels) _
          - 6&) \ 14&)) + 1&) Then
          
          MsgBox "文本框中的垂直滚动条已经滚动到最下方." '******** BOTTOM ********"
          
        End If
      End With
    End Sub
      

  6.   

    1.
    监测WM_VSCROLL消息
    若(wParam And &HFFFF)=SB_BOTTOM表示已经移动到最底
    2.
    SetScrollPos
    Declare Function SetScrollPos Lib "user32" Alias "SetScrollPos" (ByVal hwnd As Long, ByVal nBar As Long, ByVal nPos As Long, ByVal bRedraw As Long) As Long该函数设置所指定滚动条中的滚动按钮的位置,如要求重画滚动条以反映出滚动按钮的新位置。该函数提供了向后兼容性,新的应用程序应使用SetScrollinfo函数。如果函数运行成功,其返回值是滚动翻页盒的前一个位置。如果函数运行失败,其返回值是0。若想获得更多的错误信息,请调用GetLastError函数。
    注意:如果由于其他并发函数调用,滚动条又被重画,那么设置参数bRedraw为负时非常有必要的。
        因为说明滚动条位置的消息WM_HSCROLL和WM_VSCROLL只能为16位数据,那些只依赖于说明位置数据消息的应用程序在函数SetScrollPos的参数nPos中有一个实际最大值。
        但是,因为函数SetScrolllnfo,SetScrollPos,SetScrollRange,GetScrollPos, 和 GetScrollRange都支持32位的滚动条位置数据,所以有一个解决16位WM_HSCROLL和WM_VSCROLL消息阻碍的途径,请参见函数GetScrolllnfo的有关技术说明。hWnd:滚动条控制或带有标准滚动条窗体的句柄,由nBar参数值确定。
    nBar:指定滚动条将被设置。这个参数可以是下面值,含义如下:
    SB_CTL:设置滚动条控制中滚动翻页盒的位置。而参数hwnd必须是滚动条控制的句柄。
    SB_HORZ:设置窗体上标准水平滚动翻页盒的位置。
    SB_VERT:设置窗体上标准垂直滚动翻页盒的位置。
    nPos:指定滚动翻页盒的新位置。这个位置必须在滚动范围之内。若要了解更多有关滚动范围的信息,请参见SetScrollRange函数。
    bRedraw:指定滚动条是否被重画以反映出新的滚动翻页盒的位置。如果这个参数为TRUE,则滚动条将被重画;为FALSE则滚动条不被重画。
      

  7.   

    我的第一个回帖是一个函数,你得把它复制到标准模块中才能在窗体中调用啊!!!关于判断滚动条是否到了最下面,James0001和zyl910的方法比我的要好。