2008-11-11 7 views
2

Je suis en train de développer une application à écran tactile qui doit afficher une grande quantité de texte. Le problème que je rencontre est que la barre de défilement par défaut attachée aux zones de texte est trop petite pour être utilisée dans une application à écran tactile. J'ai essayé d'ajouter un contrôle de barre de défilement séparé et de l'utiliser pour contrôler le défilement de la zone de texte. Jusqu'à présent, j'ai seulement trouvé deux façons de le faire.Utiliser une barre de défilement séparée pour une zone de texte

La première solution que j'ai trouvée a été d'utiliser le sous-programme ScrollToCaret(). Cependant, je n'aime pas cette approche parce qu'elle se sent comme s'il devrait y avoir une meilleure façon de lier dans une barre de défilement pour une zone de texte sans modifier la sélection de texte

Voici un exemple:

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 

Le La deuxième méthode que j'ai inventée utilise les appels d'API Windows pour définir la position des barres de défilement et obtenir sa position actuelle. Il y a cependant quelques failles dans cette approche. Je suis incapable d'obtenir la grande valeur de changement à partir des informations de défilement des zones de texte. La plupart du temps, cela n'a pas d'importance, mais lorsque la barre de défilement par défaut de la zone de texte s'agrandit, cela signifie que ma barre de défilement ne s'aligne pas correctement, donnant à ma barre de défilement l'effet de défiler vers le bas du texte. à mi-chemin de la barre. Un autre problème avec cette approche que j'ai trouvé est que la barre de défilement par défaut pour la zone de texte doit être visible afin que je puisse récupérer et définir les informations de défilement en cours. Le dernier problème que j'ai est celui qui empoisonne les deux méthodes que j'ai découvertes. Je suis incapable de trouver un événement approprié à déclencher lorsque l'utilisateur fait défiler le texte avec autre chose que ma barre de défilement, cela signifie que je ne peux pas mettre à jour la position de ma barre de défilement même si le texte a changé sa position défilée.

Heres le code exemple:

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 

Je sais qu'il doit y avoir une meilleure façon là pour ce faire, mais jusqu'à présent, je ne l'ai pas pu venir avec tout ce qui serait une solution appropriée mon problème. Toute aide serait appréciée.

Répondre

1

Je pense qu'il y a moyen de changer la taille de la barre de défilement wint Win32API. Regardez: 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

Vous devriez être en mesure de changer la taille de la barre de défilement avec Win32API et la poignée de la barre de défilement.

0

Nous avons utilisé WPF dans notre projet le plus récent. WPF est-il une option pour vous? Si oui, il semble que toute l'interface utilisateur peut être modifiée dans les applications WPF. Nous utilisons 2 artistes UI. On travaille dans Adope Photoshop, puis convertit la sortie en XAML. La seconde fonctionne dans Expression Blend, qui produit nativement XAML.

Questions connexes