如何在WinForm中同步没有SystemOverflowException的两个RichTextBox的滚动?

问题描述 投票:1回答:1

我创建了一个代码来同步两个RichTextBox的滚动。希望这可以在没有行号的情况下工作。

但是当RichTextBox的行变大(大约2000+)时,SendMessage方法会发生System.OverflowException。

使用try / catch覆盖SendMessage并不能使它工作。

有没有办法处理IntPtr的数字大于Int.MaxValue?

这是我的代码。 enter image description here

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        for (int a = 0; a < 4000; a++)
        {
            RTB1.Text += a + "\n";
            RTB2.Text += a + "\n";
        }
    }

    [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 RTB1_VScroll(object sender, EventArgs e)
    {
        int nPos = GetScrollPos(RTB1.Handle, (int)ScrollBarType.SbVert);
        nPos <<= 16;
        uint wParam = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)nPos;
        SendMessage(RTB2.Handle, (int)Message.WM_VSCROLL, new IntPtr(wParam), new IntPtr(0)); //Error occurs here.
    }

    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
    }


}
c# winforms intptr
1个回答
2
投票

看起来您的应用程序运行为32位并且您正在获得溢出,因为UInt可能具有不适合32位签名int的值。

例如,将应用程序作为64位运行应该可以正常工作。

那就是说,你不需要那样。你可以简单地避免使用uint,只需使用int即可。

int wParam = (int)ScrollBarCommands.SB_THUMBPOSITION | (int)nPos;
© www.soinside.com 2019 - 2024. All rights reserved.