2

おそらく大量のテキストを表示しなければならないタッチスクリーンアプリケーションを開発しています。私が抱えている問題は、テキストボックスに接続されているデフォルトのスクロールバーが小さすぎて、タッチスクリーンアプリケーションで実際に使用できないことです。別のスクロールバーコントロールを追加し、それを使用してテキストボックスのスクロールを制御してみました。これまでのところ、これを行うには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

私が思いついた2番目の方法では、Windows API呼び出しを使用して、スクロールバーの位置を設定し、現在の位置を取得します。ただし、このアプローチにもいくつかの欠陥があります。テキストボックスのスクロール情報から大きな変更値を取得できません。ほとんどの場合、これは問題ではありませんが、テキストボックスのデフォルトのスクロールバーが大きくなると、スクロールバーが適切に拡大縮小されなくなり、スクロールバーがテキストの一番下までスクロールする効果が得られます。バーの途中。私が見つけたこのアプローチのもう1つの問題は、現在のスクロール情報を取得して設定できるようにするには、テキストボックスのデフォルトのスクロールバーが表示されている必要があることです。私が抱えている最後の問題は、私が発見した両方の方法を悩ませている問題です。

サンプルコードは次のとおりです。

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

これを行うにはもっと良い方法があるはずですが、これまでのところ、自分の問題に対する適切な解決策を思い付くことができませんでした。どんな助けでもいただければ幸いです。

4

2 に答える 2

1

スクロールバーwintWin32APIのサイズを変更する方法があると思います。ご覧ください:http: //pinvoke.net/search.aspx?search = scrollbar& namespace = [All] 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とスクロールバーのハンドルを使用してスクロールバーのサイズを変更できるはずです。

于 2008-11-11T17:55:27.663 に答える
0

最近のプロジェクトでは WPF を使用しています。WPF はあなたのためのオプションですか? はいの場合、WPF アプリですべての UI を変更できるように見えます。2 人の UI アーティストを使用しています。1 つは Adope Photoshop で動作し、出力を XAML に変換します。2 つ目は、XAML をネイティブに生成する Expression Blend で機能します。

于 2008-11-16T00:04:57.380 に答える