我有一個多行文本框,它的水平和垂直滾動條都可見,并且 WordWrap 設定為 False。我在文本框中加載了一個大文本檔案以允許用戶對其進行編輯。
編輯功能自動化要求我將整個文本框的值存盤到一個值中,對其進行處理,然后將其存盤回文本框。這一切都很好,但是通過在文本框中設定一個字串,它首先清除它然后再次填充它。此操作將滾動條位置設定為左上角。
我試圖Textbox1.scrolltocaret在我的更新例程中使用它使游標再次可見,但它不會滾動到控制元件之前設定的確切位置。
textbox1.scrolltocaret此外,每次用戶使用箭頭鍵移動時,我都不知道如何呼叫。
如何存盤和恢復滾動條位置?
這是我的代碼:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
If Me.bPauseUpdate = True Then Exit Sub
Me.bPauseUpdate = True
Me.CursorLocation = TextBox1.SelectionStart
Dim aWorkingText() As String = Me.TextBox1.Lines
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Code that changes aWorkingText lives here, but is not relevant for this question
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
TextBox1.Lines = aWorkingText
Me.bPauseUpdate = False
TextBox1.SelectionStart = Me.CursorLocation
Textbox1.scrolltocaret
End Sub
我研究過使用Textbox1.Scrollbars,但它們僅用于控制滾動條是否可見。
我試圖使它與以下代碼一起作業,但這不允許我實際設定值,即使 IDE 說我應該能夠這樣做:
Me.ScrollbarX = TextBox1.AutoScrollOffset.X
Me.ScrollbarY = TextBox1.AutoScrollOffset.Y
.
.
.
TextBox1.AutoScrollOffset.X = Me.ScrollbarX
TextBox1.AutoScrollOffset.Y = Me.ScrollbarY

我什至試過這個,但它產生了相同的結果。
TextBox1.AutoScrollOffset.X = New Point(Me.ScrollBarX)
TextBox1.AutoScrollOffset.Y = New Point(Me.ScrollBarY)
uj5u.com熱心網友回復:
您可以使用GetScrollPosWin32 API 獲取 TextBox 控制元件的當前垂直和水平滾動條位置。
Imports System.Runtime.InteropServices
<DllImport("user32.dll", CharSet:=CharSet.Auto)> Friend Shared Function GetScrollPos(hWnd As IntPtr, nBar As Integer) As Integer
End Function
Friend Enum SBOrientation As Integer
SB_HORZ = &H0
SB_VERT = &H1
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Horizontal scroll position
GetScrollPos(TextBox1.Handle, SBOrientation.SB_HORZ)
'Vertical scroll position
GetScrollPos(TextBox1.Handle, SBOrientation.SB_VERT)
End Sub
使用SendMessageWin32 API 設定 TextBox 滾動位置
<DllImport("user32.dll")> Friend Shared Function SendMessage(hWnd As IntPtr, msg As UInteger, wParam As UInteger, lParam As UInteger) As IntPtr
End Function
Friend Const SB_THUMBPOSITION As UInteger = 4
Friend Enum WindowMessage As Integer
WM_HSCROLL = &H114
WM_VSCROLL = &H115
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Set Vertical scroll position
Dim vPos = 16
Dim wparam1 = CUInt(vPos) << 16 Or (SB_THUMBPOSITION And &HFFFF)
SendMessage(TextBox1.Handle, CUInt(WindowMessage.WM_VSCROLL), CUInt(wparam1), CUInt(0))
'Set Horizontal scroll position
Dim hPos = 100
Dim wparam2 = CUInt(hPos) << 16 Or (SB_THUMBPOSITION And &HFFFF)
SendMessage(TextBox1.Handle, CUInt(WindowMessage.WM_HSCROLL), CUInt(wparam2), CUInt(0))
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530214.html
標籤:VB.net文本框滚动条
