2010-06-06 90 views
1

我已经通过相关的问题进行了搜索,但找不到我需要的东西。RichTextBox在visual studio中的垂直滚动条操作

我有一个richtextbox控件。当垂直滚动条到达某个位置(比如90%到底部)时,我需要触发一个事件。我一直在玩富文本框的事件,但还没有找到任何东西。

任何帮助将不胜感激。

+0

快速说明,你使用WPF或WinForms? – Dennis 2010-06-07 00:05:34

+0

Visual Studio的WinForms – Kizaru 2010-06-07 00:08:32

回答

2

您可以处理VScoll事件检测垂直滚动和使用功能

private static double GetRichTextBoxScrolPos(RichTextBox textBox) 
{ 
    if(textBox1.TextLength == 0) return 0; 
    var p1 = textBox.GetPositionFromCharIndex(0); 
    var p2 = textBox.GetPositionFromCharIndex(textBox.TextLength - 1); 

    int scrollPos = -p1.Y; 
    int maxScrolPos = p2.Y - p1.Y - textBox.ClientSize.Height; 

    if(maxScrolPos <= 0) return 0; 

    double d = 100.0 * (double)scrollPos/(double)maxScrolPos; 
    if(d < 0) d = 0; 
    else if(d > 100) d = 100; 

    return d; 
} 

确定滚动位置。结果是%(100%=完全滚动到底部)。

重要注意事项:此功能不是绝对准确,但您可能会发现结果准确无误。可以通过测量底线高度进一步改善(例如使用Graphics对象)。 100%可靠的方法是获取VScrollBar句柄并使用WinAPI查询它的位置,但这将需要更多的工作。

+0

谢谢!我会试几分钟:) – Kizaru 2010-06-07 00:09:01

+1

好的,这似乎工作。函数在事件中经常被调用的唯一问题。有没有办法让我每5秒限制一次功能?当我重置文本框时,它似乎几乎被无限调用。 – Kizaru 2010-06-07 00:56:36

+0

当您计划更新并在更新后再次订阅时,您可以取消订阅VScroll事件。如果您仍然需要按时间限制呼叫次数,则可以将函数结果和呼叫时间缓存在2个变量中,并且如果在5秒内调用该函数,则可以从之前的结果快速返回。 – max 2010-06-07 01:05:30