2011-02-04 92 views
0

我有一個雙贏的形式與SplitContainer同步RichTextBox的垂直滾動與SplitContainer的面板滾動

的SplitContainer中的panel1RichTextBox的。

Panel2 AutoScroll設置爲true。

我想同步滾動RichTextBoxPanel2反之亦然。我怎樣才能做到這一點?任何想法?

我試過this,它是爲兩個RichTextBox es工作,但不是在我的情況。

回答

1

獲取兩個控件的滾動信息:

首先,你需要下面的Win32 API的(進口System.Runtime.InteropServices)到項目

<DllImport("user32.dll")> _ 
Private Shared Function GetScrollInfo(ByVal hwnd As IntPtr, ByVal fnBar As Integer, ByRef lpsi As SCROLLINFO) As <MarshalAs(UnmanagedType.Bool)> Boolean 
End Function 

<DllImport("user32.dll")> _ 
Private Shared Function SetScrollInfo(ByVal hwnd As IntPtr, ByVal fnBar As Integer, <[In]()> ByRef lpsi As SCROLLINFO, ByVal fRedraw As Boolean) As Integer 
End Function 

<DllImport("User32.dll", CharSet:=CharSet.Auto, EntryPoint:="SendMessage")> _ 
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr 
End Function 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean 
End Function 

'added by edit 
Private Const SB_THUMBTRACK As Integer = 5 
Private Const WM_VSCROLL As Integer = &H115 
Private Const WM_HSCROLL As Integer = &H114 

Public 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 Structure SCROLLINFO 
     Public cbSize As UInteger 
     Public fMask As UInteger 
     Public nMin As Integer 
     Public nMax As Integer 
     Public nPage As UInteger 
     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 + SIF_PAGE + SIF_POS + SIF_TRACKPOS 
    End Enum 

'create some public properties to get and set scroll position for any scrollable control: 

Public Property _VerticalScroll(ByVal hwnd As IntPtr) As Integer 
    Get 
     Dim si As New SCROLLINFO() 
     si.cbSize = CUInt(Marshal.SizeOf(si)) 
     si.fMask = CUInt(ScrollInfoMask.SIF_ALL) 
     GetScrollInfo(hwnd, CInt(ScrollBarDirection.SB_VERT), si) 
     Return si.nPos 
    End Get 
    Set(ByVal value As Integer) 
     Dim si As New SCROLLINFO() 
     si.cbSize = CUInt(Marshal.SizeOf(si)) 
     si.fMask = CUInt(ScrollInfoMask.SIF_ALL) 
     GetScrollInfo(hwnd, CInt(ScrollBarDirection.SB_VERT), si) 
     If value > si.nMax Then 
      value = si.nMax 
     End If 

     Dim ptrWparam = New IntPtr(SB_THUMBTRACK + &H10000 * value) 
     SetScrollPos(hwnd, Orientation.Vertical, value, True) 
     PostMessage(hwnd, WM_VSCROLL, ptrWparam, IntPtr.Zero) 
    End Set 
End Property 

Public Property _HorizontalScroll(ByVal hwnd As IntPtr) As Integer 
    Get 
     Dim si As New SCROLLINFO() 
     si.cbSize = CUInt(Marshal.SizeOf(si)) 
     si.fMask = CUInt(ScrollInfoMask.SIF_ALL) 
     GetScrollInfo(hwnd, CInt(ScrollBarDirection.SB_HORZ), si) 
     Return si.nPos 
    End Get 
    Set(ByVal value As Integer) 
     Dim si As New SCROLLINFO() 
     si.cbSize = CUInt(Marshal.SizeOf(si)) 
     si.fMask = CUInt(ScrollInfoMask.SIF_ALL) 
     GetScrollInfo(hwnd, CInt(ScrollBarDirection.SB_HORZ), si) 
     If value > si.nMax Then 
      value = si.nMax 
     End If 

     Dim ptrWparam = New IntPtr(SB_THUMBTRACK + &H10000 * value) 
     SetScrollPos(hwnd, Orientation.Horizontal, value, True) 
     PostMessage(hwnd, WM_HSCROLL, ptrWparam, IntPtr.Zero) 
    End Set 
End Property 

你的下一步行動是監視滾動條更改....通過計時器等...然後在需要時更新其他控件。

+1

未聲明`SB_THUMBTRACK`,`WM_HSCROLL`和`WM_VSCROLL` – twnaing 2011-03-03 07:08:00