在TextBox中更改滚动条位置?

时间:2010-12-20 21:31:40

标签: c# .net c++ winforms scrollbar

如果我想更改TextBox滚动条的位置,除此之外我还需要做什么:

SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

此函数仅更改滚动条位置,但不更新实际的TextBox(因此滚动条“滚动”,但文本没有)。有什么建议?我正在使用Windows Forms和.NET 4,以及Visual Studio 2008。

3 个答案:

答案 0 :(得分:6)

我通常会这样做:

textBox1.Select(textBox1.Text.Length, 0);
textBox1.ScrollToCaret();

选择0个字符只需将光标移动到所需位置(在示例代码中:在文本末尾)。

答案 1 :(得分:4)

首先,定义一个常量值:

const int EM_LINESCROLL = 0x00B6;

然后,声明 user32.dll 的两个外部方法:

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, 
                               int nPos, bool bRedraw);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int wMsg, 
                               int wParam, int lParam);

最后,使用这些方法来做真实的事情:

SetScrollPos(myTextBox.Handle,1,myTextBox.Lines.Length-1,true);
SendMessage(myTextBox.Handle,EM_LINESCROLL,0,
                             myTextBox.Lines.Length-1);

更新文本框时,您还可以使用 GetScrollPos()进行滚动位置保存:

[DllImport("user32.dll")]
static extern int GetScrollPos(IntPtr hWnd, int nBar);

答案 2 :(得分:1)

尽量避免直接控制它,它只是不能很好地工作。设置TextBox.SelectionStart属性以确保插入符是要显示的行。然后调用ScrollToCaret。控件必须具有使其工作的重点。您的用户在找回它时不会有任何问题。

TextBox是控件的祖父的包装器,它已经23岁了,比我估计的许多SO用户还要老。当640 KB对每个人都足够时,Window 2.0必须在386SUX或更低版本上运行。 WPF版本有更多口哨。