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

时间:2015-04-27 17:13:57

标签: c# winforms cursor richtextbox synchronized-scrolling

我需要一些帮助。 目前我正在使用C#中的脚本编辑器,我有两个丰富的文本框:programTextBox,整个文本和linesTextBox,它们计算并显示行数。

我希望他们同时滚动。我做了一些搜索,实际上我发现了一些有效的代码,但是如果有一些问题的话。这是代码:

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 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));
}

有效。的种类。你可能会问:“问题是什么?”。良好:

1)当总行数变为2500时,我的程序崩溃。我收到溢出错误。

2)如果我使用滚动条而不是鼠标滚轮上下移动,那么我的第二个富文本框(linesTextBox)将不会跟随第一个,除非我释放滚动条。

1 个答案:

答案 0 :(得分:0)

如果应用程序滚动窗口的内容,它还必须使用SetScrollPos函数重置滚动框的位置 看看这个: https://msdn.microsoft.com/en-in/library/aa926329.aspx

另外WM_VSCROLL消息只携带16位滚动框位置数据,这可能是您应该尝试GetScrollInfo的原因,因为它有32位滚动框位数据。这可能会解决您的两个问题。希望这会有所帮助...