教各位一个关于滚动条的问题?
textbox.scrollbars 已设为 2 , 右边有了滚动条。1)有没有办法判断一个textbox右边的滚动条是否到了最下面(最底)?
2)可以指定滚动条的一个值。然后让滚动条移动吗?3)可以隐藏滚动条吗?
textbox.scrollbars 已设为 2 , 右边有了滚动条。1)有没有办法判断一个textbox右边的滚动条是否到了最下面(最底)?
2)可以指定滚动条的一个值。然后让滚动条移动吗?3)可以隐藏滚动条吗?
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
然后符合条件就重新滚动。 要不然这个api不可让其循环滚动。
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
我怎么执行之后不会,text1不会滚动呢?
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
监测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则滚动条不被重画。