2008-11-11 2 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 호출을 사용했다. 그러나이 방법에도 몇 가지 단점이 있습니다. textboxes 스크롤 정보에서 큰 변경 값을 가져올 수 없습니다. 대부분의 경우 이것은 중요하지 않지만 텍스트 상자의 기본 스크롤 막대가 커지면 스크롤 막대가 제대로 스크롤되지 않으며 텍스트 아래쪽으로 스크롤하는 효과를 내 스크롤 막대에 부여합니다. 바의 절반 아래. 이 접근법의 또 다른 문제점은 현재 스크롤 정보를 검색하고 설정할 수 있도록 텍스트 상자의 기본 스크롤 막대가 표시되어야한다는 것입니다. 내가 가지고있는 마지막 문제는 내가 발견 한 두 가지 방법 모두를 괴롭히는 것입니다. 사용자가 내 스크롤 막대 이외의 다른 텍스트로 스크롤 할 때 적절한 이벤트를 찾을 수 없습니다. 즉, 텍스트의 스크롤 된 위치가 변경 되었더라도 스크롤 막대의 위치를 ​​업데이트 할 수 없습니다.

Heres는 예제 코드 :이 작업을 수행하는 거기에 더 나은 방법이있을 알아,하지만 지금까지 내가에 대한 적절한 해결책이 될 것 아무것도 가지고 올 수 없었던

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로 변환합니다. 두 번째는 XAML을 기본적으로 생성하는 Expression Blend에서 작동합니다.