2010-12-20 128 views
5

如果我想换一个TextBox的滚动条的位置,我需要什么,除了这事:更改TextBox中的滚动条位置?

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

此功能只改变滚动条的位置,但它不会更新实际TextBox(所以滚动条“滚动”,但文字不)。有什么建议么?我使用Windows窗体和.NET 4,与Visual Studio 2008

回答

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); 
+0

如果我有像字节流一样的真正长行,该怎么办? – igal 2010-12-20 22:06:06

7

我通常做的:

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

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

1

尽量避免直接控制它,它只是不能很好地工作。设置TextBox.SelectionStart属性以确保插入符号是要显示的行。然后调用ScrollToCaret。控制必须有重点来完成这项工作。你的用户不会有任何麻烦找回来。

TextBox是控件的大爸爸的包装,它已经23岁了,比我认为的许多SO用户都要老。当640 KB足够用于每个人,并且Window 2.0必须在386SUX或更低的频率上运行时。 WPF版本有更多的口哨声。