如何在 WinForm 中同步两个 RichTextBox 的滚动而没有 SystemOverflowException?
How to Synchronize Scroll of two RichTextBox without SystemOverflowException in WinForm?
我编写了一个同步两个 RichTextBox 滚动的代码。
希望这能在没有行号问题的情况下工作。
但是当 RichTextBox 的行变大时(大约 2000+),System.OverflowException 发生在 SendMessage 方法。
用 try/catch 覆盖 SendMessage 无法正常工作。
有什么方法可以处理大于 Int.MaxValue 的 IntPtr 吗?
这是我的代码。
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
}
}
看起来您的应用程序 运行 是 32 位的,您遇到了溢出,因为 UInt
可能有一个值不适合 32 位签名 int
.
例如,运行您的 64 位应用程序应该可以正常工作。
就是说,您不需要那个。您可以简单地避免使用 uint
而只使用 int
就可以了。
int wParam = (int)ScrollBarCommands.SB_THUMBPOSITION | (int)nPos;
我编写了一个同步两个 RichTextBox 滚动的代码。 希望这能在没有行号问题的情况下工作。
但是当 RichTextBox 的行变大时(大约 2000+),System.OverflowException 发生在 SendMessage 方法。
用 try/catch 覆盖 SendMessage 无法正常工作。
有什么方法可以处理大于 Int.MaxValue 的 IntPtr 吗?
这是我的代码。
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
}
}
看起来您的应用程序 运行 是 32 位的,您遇到了溢出,因为 UInt
可能有一个值不适合 32 位签名 int
.
例如,运行您的 64 位应用程序应该可以正常工作。
就是说,您不需要那个。您可以简单地避免使用 uint
而只使用 int
就可以了。
int wParam = (int)ScrollBarCommands.SB_THUMBPOSITION | (int)nPos;