2008-11-11 18 views
2

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

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

我知道一定是有一個更好的方式來做到這一點,但到目前爲止,我還沒有能夠拿出任何東西,這將是一個合適的解決方案我的問題。任何幫助,將不勝感激。

回答

0

我們在最近的項目中一直使用WPF。 WPF是你的選擇嗎?如果是的話,它看起來好像所有的UI都可以在WPF應用程序中改變。我們使用2個UI藝術家。在Adope Photoshop中工作,然後將輸出轉換爲XAML。第二種在Expression Blend中工作,它本地生成XAML。