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

5

我需要一些帮助。目前,我正在使用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时,我的程序会崩溃并报错overflow。

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


这里的解决方案:https://dev59.com/gnI-5IYBdhLWcg3wfoa1#8402026 对我解决了溢出问题。 - Jim Simson
1个回答

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接