C# richTextBox 文本框 滚动条位置

gold_one 2015-10-08 01:34:37
这是一个语音朗读的文本框,朗读过程中,正在被读到的词会被高亮选中,当光标(高亮选中的词)走到文本框最下的时候,滚动条每次只向下滚动一行,有什么办法可以滚动1屏。

我用滚动条事件滚动条会乱滚,应该是相应了SendKeys.Send("{PGDN}");滚动事件导致死循环了。


private void frmSpeech_Load(object sender, EventArgs e)
{
txtContent.VScroll += new EventHandler(txtContent_VScroll);
}

private void txtContent_VScroll(object sender, EventArgs e)
{
if (btnPlay.Text == ">")
{
SendKeys.Send("{PGDN}");
}
}


并且,并且就算解决了上述问题,这个方法只在txtContent获得焦点的时候有效,有什么方法可以在txtContent失去焦点、或者整个窗体都失去焦点依然有效?
...全文
343 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gold_one 2015-10-08
  • 打赏
  • 举报
回复
private void timPageDown_Tick(object sender, EventArgs e)
{
if (btnPlay.Text == ">")
{
int index = txtContent.GetFirstCharIndexOfCurrentLine();//得到当前行第一个字符的索引
int line = txtContent.GetLineFromCharIndex(index);//得到当前行的行号,从0开始
int mo = line % 25;
if (mo == 0)
{
if (line + 25 < txtContent.Lines.Length)
{
int start = txtContent.GetFirstCharIndexFromLine(line + 26);
txtContent.SelectionStart = start;
txtContent.ScrollToCaret();
}
else
{
int start = txtContent.GetFirstCharIndexFromLine(txtContent.Lines.Length - 1);
txtContent.SelectionStart = start;
txtContent.ScrollToCaret();
}
}
}

用这个方法解决了问题,可是不完美,当用户拖动了滚动条,就乱了,要等到下一次计数后才会回复。

最好就是当光标Y坐标距离文本框下边缘小于等于某个固定值 执行才完美。
ajianchina 2015-10-08
  • 打赏
  • 举报
回复
“朗读过程中,正在被读到的词会被高亮选中” 你这句话说明你已有相关事件对读取行程进行了处理,下面给你一段代码,是指定滚动到指定行的,你在上面的处理事件中先判断,然后在执行滚动。 int line = 8;//滚动到指定行 int start = this.richTextBox1.GetFirstCharIndexFromLine(line); this.richTextBox1.SelectionStart = start; this.richTextBox1.ScrollToCaret();
exception92 2015-10-08
  • 打赏
  • 举报
回复
换WPF的吧。可以控制滚动的 偏移量,winform的就不知道了。
gold_one 2015-10-08
  • 打赏
  • 举报
回复
这没用吧,滚动条在可见内容区上的位置和光标位置没有直接联系。 是不是通过获取当前光标的行号,然后整除文本框的行数,余数等于0的时候执行一下SendKeys.Send("{PGDN}"); 关键是怎样在窗体失去焦点后,依然执行翻页操作。
wc_ling 2015-10-08
  • 打赏
  • 举报
回复
ExtentHeight 获取可见内容区域的垂直大小。 滚动条滚动位置与ExtentHeight 对应上

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧