簡體   English   中英

為文本框使用單獨的滾動條

[英]Use a separate scroll bar for a textbox

我正在開發一種必須顯示可能大量文本的觸摸屏應用程序。 我遇到的問題是,附加到文本框的默認滾動條太小,無法在觸摸屏應用程序中實際使用。 我嘗試添加一個單獨的滾動條控件,並使用它來控制文本框的滾動。 到目前為止,我只想出兩種方法。

我想到的第一種方法是使用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

我知道一定有更好的方法可以做到這一點,但是到目前為止,我還沒有提出能夠解決我的問題的任何方法。 任何幫助,將不勝感激。

我認為,有一種方法可以更改Win32API滾動條的大小。 查看: http : //pinvoke.net/search.aspx? search= scrollbar & namespace= [全部] http://pinvoke.net/default.aspx/user32/FindWindowEx.html http://pinvoke.net/default.aspx /user32/GetScrollBarInfo.html http://pinvoke.net/default.aspx/user32/ShowScrollBar.html

您應該能夠使用Win32API和滾動條的句柄更改滾動條的大小。

我們在最近的項目中一直使用WPF。 WPF是您的選擇嗎? 如果是,則似乎可以在WPF應用程序中更改所有UI。 我們使用2位UI藝術家。 一個可以在Adope Photoshop中工作,然后將輸出轉換為XAML。 第二個在Expression Blend中起作用,后者本身會生成XAML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM