两个RichTextBox(C#)的同步滚动

两个RichTextBox(C#)的同步滚动,c#,winforms,cursor,richtextbox,synchronized-scrolling,C#,Winforms,Cursor,Richtextbox,Synchronized Scrolling,我需要一些帮助。 目前,我正在用C#编写一个脚本编辑器,我有两个富文本框:programTextBox,其中包含全部文本,linesTextBox计算并显示行数 我希望它们同时滚动。我做了一些搜索,实际上我找到了一些有效的代码,但是if有一些问题。代码如下: public enum ScrollBarType : uint { SbHorz = 0, SbVert = 1, SbCtl = 2, SbBoth = 3 } public enum Message :

我需要一些帮助。 目前,我正在用C#编写一个脚本编辑器,我有两个富文本框:programTextBox,其中包含全部文本,linesTextBox计算并显示行数

我希望它们同时滚动。我做了一些搜索,实际上我找到了一些有效的代码,但是if有一些问题。代码如下:

public enum ScrollBarType : uint
{
    SbHorz = 0,
    SbVert = 1,
    SbCtl = 2,
    SbBoth = 3
}
public enum Message : uint
{
    WM_VSCROLL = 0x0115
}
public enum ScrollBarCommands : uint
{
    SB_THUMBPOSITION = 4
}
[DllImport("User32.dll")]
public extern static int GetScrollPos(IntPtr hWnd, int nBar);
[DllImport("User32.dll")]
public extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

private void programmetextbox\u VScroll(对象发送方,事件参数e)
{
int nPos=GetScrollPos(programTextBox.Handle,(int)ScrollBarType.SbVert);

nPos如果应用程序滚动窗口的内容,它还必须使用SetScrollPos功能重置滚动框的位置 看看这个:

此外,WM_VSCROLL消息仅包含16位滚动框位置数据。这可能是您应该尝试GetScrollInfo的原因,因为它包含32位滚动框位置数据。这可能会解决您的两个问题。希望这有助于…

这里的解决方案:为我解决了溢出问题。
private void programTextBox_VScroll(object sender, EventArgs e)
{
    int nPos = GetScrollPos(programTextBox.Handle, (int)ScrollBarType.SbVert);
    nPos <<= 16;
    uint wParam = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)nPos;
    SendMessage(linesTextBox.Handle, (int)Message.WM_VSCROLL, new IntPtr(wParam), new IntPtr(0));
}