在TextBox中更改滚动条位置?

iga*_*gal 6 .net c# c++ scrollbar winforms

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

SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
Run Code Online (Sandbox Code Playgroud)

此函数仅更改滚动条位置,但不更新实际TextBox(因此滚动条"滚动",但文本不会).有什么建议?我在Visual Studio 2008中使用Windows Forms和.NET 4.

Joh*_*ald 6

我经常这样做:

textBox1.Select(textBox1.Text.Length, 0);
textBox1.ScrollToCaret();
Run Code Online (Sandbox Code Playgroud)

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


THE*_*TOR 5

首先,定义一个常量值:

const int EM_LINESCROLL = 0x00B6;
Run Code Online (Sandbox Code Playgroud)

然后,声明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);
Run Code Online (Sandbox Code Playgroud)

最后,使用以下方法来做真实的事情:

SetScrollPos(myTextBox.Handle,1,myTextBox.Lines.Length-1,true);
SendMessage(myTextBox.Handle,EM_LINESCROLL,0,
                             myTextBox.Lines.Length-1);
Run Code Online (Sandbox Code Playgroud)

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

[DllImport("user32.dll")]
static extern int GetScrollPos(IntPtr hWnd, int nBar);
Run Code Online (Sandbox Code Playgroud)