如何判断滚动条是否在最末端

解决方案 »

  1.   

    你用眼睛看一下就知道了噻
    楼主把问题说清楚一点嘛。看这个是否有效:Scroll1.Value = Scroll1.Max 时,流动条到了末端。
      

  2.   

    如果是滚动条控件好办,按楼上的办.
    但,如果是其他控件,比如列表控件的滚动条,应咋办.
    我找了一下Windows消息,想找一下有没有这样的控件消息,似乎没找到!
      

  3.   

    我是想用程序自动来检测RichTextBox滚动条是否滚到了最末端, 不知如何实现?
      

  4.   

    '模块定义API
    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'在窗体中使用sendmessage函数,具体不是太会,再问问,估计是这样.
    Private Sub Command3_Click()
    Dim rc As Long
    rc = SendMessage(RichTextBox1.hwnd, 10, 5, 5)
    Text1.Text = rc
    End Sub
      

  5.   

    你如果说要判断光标目前在RichTextBox内容里面的第几行或在第几个字符, 这样才有意义, 而且很简单,如果你的总行数小于你的RichTextbox可容纳的行数, 就不会有ScrollBars出现, 就算大于此高度, 在同一页面之下,光标移动,ScrollBar也不会有变化.你如果说要将Scrollbars自动移动到底部SendMessage RichTextBox1.hwnd, SCROLL, 0, 1 一行就搞定,你要判断ScrollBars的位置不知你的目的为何 ? 懒得去想了..........
      

  6.   

    好像还是不行.不知道SendMessage函数有没有检测末端滚动条的消息参数,或者说只要知道我当前页面在最后就行.
    心急啊........
      

  7.   

    用SendMessage(RichTextBox1.hWnd, WM_VSCROLL, MakeLong(SB_THUMBPOSITION, nPos), 0)来实现RichTextBox的像素级滚动效果,问题是没法来判断它是否已经滚到最末端来跳出循环.
      

  8.   

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Const EM_GetSel = &HB0
    Const EM_LineFromChar = &HC9
    Const EM_LineInsex = &HBB
    Dim i&, j&, Tlines&, LineNum&
    Private Sub Form_Load()
       RichTextBox1.LoadFile "c:\cdkey.txt", 1
       Tlines = RichTextBox1.Height \ ((20 * RichTextBox1.Font.Size) + 60)
    End SubPrivate Function proccess(ByVal textHwnd As Long, lNum As Long) As Long
       i = SendMessage(textHwnd, EM_GetSel, wParam, lParam)
       j = i / 2 ^ 16
       proccess = SendMessage(textHwnd, EM_LineFromChar, j, 0)
    End FunctionPrivate Sub Command1_Click()
       LineNum = proccess(RichTextBox1.hwnd, LineNum) + 1
       If LineNum <= Tlines Then
          MsgBox "目前光标在第1 页,第 " & CStr(LineNum) & " 行"
       Else
          MsgBox "目前光标在第 " & CStr(LineNum \ Tlines + 1) & " 页,第 " & CStr(LineNum) & " 行"
       End If
    End Sub
      

  9.   

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Const EM_GetSel = &HB0
    Const EM_LineFromChar = &HC9
    Const EM_LineInsex = &HBB
    Const EM_GETLINECOUNT = &HBA
    Dim i&, j&, TotalLines&, Tlines&, LineNum&
    Private Sub Form_Load()
       RichTextBox1.LoadFile "c:\cdkey.txt", 1
       TotalLines = TextBoxLineCnt(RichTextBox1)
       Tlines = RichTextBox1.Height \ ((20 * RichTextBox1.Font.Size) + 60)
    End SubPrivate Function proccess(ByVal textHwnd As Long, lNum As Long) As Long
       i = SendMessage(textHwnd, EM_GetSel, wParam, lParam)
       j = i / 2 ^ 16
       proccess = SendMessage(textHwnd, EM_LineFromChar, j, 0)
    End FunctionPrivate Sub Command1_Click()
       LineNum = proccess(RichTextBox1.hwnd, LineNum) + 1
       If LineNum  <= Tlines Then 
          MsgBox "目前光标在第1 页,第 " & CStr(LineNum) & " 行" 
       Else 
          MsgBox "目前光标在第 " & CStr(LineNum \ Tlines + 1) & " 页,第 " & CStr(LineNum) & " 行" 
       End If 
       If (TotalLines \ Tlines + 1) = CStr(LineNum \ Tlines + 1) Or LineNum >= TotalLines - Tlines + 1 Then MsgBox "目前光标在最后一页"
    End SubPublic Function TextBoxLineCnt(ct1 As RichTextBox) As Long
       TextBoxLineCnt = SendMessage(ct1.hwnd, EM_GETLINECOUNT, 0, 0)
    End Function
      

  10.   

    看着挺复杂的,可不可以这样:新建一个RichTextBox控件,让这个控件的Height一直拉长至适合装下整个文件的大小(不显示滚动条),然后直接获取这个RichTextBox的高即可.因为我像素级实现滚动的时候只要nPos累加至与这个RichTextBox的Height相等即可.如果是这样的话,问题将会转化为我怎样才能知道RichtextBox拉伸的长度刚好适合文件的内容呢?也就是说刚好没有了滚动条.
      

  11.   

    (20 * RichTextBox1.Font.Size) + 60  这是每一行不同字号占用的高度, 把它乘上你要装几行, 不就等于 RichtextBox应有的高度吗 ? 但是你的内容如果是长篇大串,数十行上百行便当我没说...........