我正在開發一個觸摸屏應用程序,它必須顯示大量的文本。我遇到的問題是附加到文本框的默認滾動條太小而不能實際用於觸摸屏應用程序。我嘗試添加一個單獨的滾動條控件並使用它來控制文本框的滾動。到目前爲止,我只有兩種方法來做到這一點。爲文本框使用單獨的滾動條
我想出的第一種方法是使用ScrollToCaret()子例程。然而,因爲它覺得好像應該有更好的方式在滾動條的文本框,以配合在不改變文本選擇
下面是一個例子,我不喜歡這種方法:
Dim oSelectionStart As Integer = CInt((TextBox1.Text.Length \ (VScrollBar1.Maximum - VScrollBar1.LargeChange - 1)) * VScrollBar1.Value)
If oSelectionStart >= TextBox1.Text.Length - 10 Then
oSelectionStart = TextBox1.Text.Length
End If
If oSelectionStart <= 10 Or VScrollBar1.Value < 2 Then
oSelectionStart = 0
End If
If Not TextBox1.SelectionStart = oSelectionStart Then
TextBox1.SelectionStart = oSelectionStart
TextBox1.ScrollToCaret()
End If
的我想出的第二種方法是使用Windows API調用來設置滾動條位置並獲取其當前位置。然而,這種方法也存在一些缺陷。我無法從文本框滾動信息中獲得大的更改值。大多數情況下,這並不重要,但是當文本框上的默認滾動條變大時,意味着我的滾動條無法正確縮放,從而給我的滾動條帶來滾動到文本底部的效果,在酒吧的一半。我發現這種方法的另一個問題是,文本框的默認滾動條必須可見,以便我能夠檢索和設置當前的滾動信息。我遇到的最後一個問題是困擾我發現的兩種方法。當用戶使用滾動條以外的任何其他內容滾動文本時,我無法找到適當的事件觸發,這意味着即使文本已更改其滾動位置,我也無法更新滾動條的位置。
繼承人的示例代碼:
Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)
Dim minPos As Integer = 0
Dim maxPos As Integer = 0
Dim newPos As Integer = 0
GetScrollRange(TextBox1.Handle, SBS_VERT, minPos, maxPos)
Dim vScrollPerc As Double = ((100/(VScrollBar1.Maximum - (VScrollBar1.LargeChange - 1))) * VScrollBar1.Value) * 0.01
newPos = CInt(((maxPos - minPos) * vScrollPerc) + minPos)
SetScrollPos(TextBox1.Handle, SBS_VERT, newPos, True)
PostMessageA(TextBox1.Handle, WM_VSCROLL, SB_THUMBPOSITION + &H10000 * newPos, Nothing)
End Sub
'Scrollbar direction
Const SBS_HORZ = 0
Const SBS_VERT = 1
'Windows Messages
Const WM_VSCROLL = &H115
Const WM_HSCROLL = &H114
Const SB_THUMBPOSITION = 4
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> Private Structure SCROLLINFO
Public cbSize As Integer
Public fMask As Integer
Public nMin As Integer
Public nMax As Integer
Public nPage As Integer
Public nPos As Integer
Public nTrackPos As Integer
End Structure
Private Enum ScrollBarDirection
SB_HORZ = 0
SB_VERT = 1
SB_CTL = 2
SB_BOTH = 3
End Enum
Private Enum ScrollInfoMask
SIF_RANGE = &H1
SIF_PAGE = &H2
SIF_POS = &H4
SIF_DISABLENOSCROLL = &H8
SIF_TRACKPOS = &H10
SIF_ALL = (SIF_RANGE Or SIF_PAGE Or SIF_POS Or SIF_TRACKPOS)
End Enum
Private Declare Function GetScrollPos Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer
Private Declare Function SetScrollPos Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer
Private Declare Function PostMessageA Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Boolean
Private Declare Function GetScrollRange Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal nBar As Integer, ByRef lpMinPos As Integer, ByRef lpMaxPos As Integer) As Integer
Private Declare Function GetScrollInfo Lib "user32" (ByVal hWnd As IntPtr, ByVal fnBar As ScrollBarDirection, ByRef lpsi As SCROLLINFO) As Integer
我知道一定是有一個更好的方式來做到這一點,但到目前爲止,我還沒有能夠拿出任何東西,這將是一個合適的解決方案我的問題。任何幫助,將不勝感激。