RichTextBox中的手动自动换行

时间:2013-07-29 07:12:57

标签: winforms richtextbox word-wrap

我需要在Windows窗体中创建RichTextBox,它最多包含18个字符,最多6行。 RichTextBox的问题是当你写一个很长的单词时,它会显示为两行,但它被视为一行。例如:

  

这是
  supercalifragilist
  icexpialidocious

这是一个有两行的文字。

我的第一个方法是创建自己的类,它继承自RichTextBox并覆盖OnTextChanged。这很好,但我完全忘记了自动换行。所以我在我的方法中实现了自动换行。

算法非常简单:当文本更改时,将其拆分为“space”和“new line”字符。然后我计算连续输入的字符数,如果有空格,我将它放在这一行。当没有空格的时候,我正在创造新的界限。

令人讨厌的部分:现在它有一些错误,我不知道如何解决。假设用户已经写了18个字符的长字。他在最后一个角色后面有一个光标。现在:

  1. 他可以按回车键,手动创建换行符号,这个角色总是应该在这个地方。
  2. 他可以按空格开始写新词。
  3. 他可以继续为这个单词写其他字符。
  4. 在每个场景中,他将以18个字符长的单词和“新行”字符结束。我不知道如何发现,他想做什么。请记住,用户可以将光标放在任何地方并编辑他之前输入的文本。

    我知道我可以创建自定义字符串类(继承自字符串)或保留输入单词列表,但实现这一点会很痛苦,代码将开始变得不可读。

    任何想法如何做得更好?

1 个答案:

答案 0 :(得分:0)

我明白了。我的另一个想法是使用StringReader并按字符逐字阅读,但实施起来也非常麻烦和痛苦。

最好的方法是不要更改RichTextBox的默认行为。我没有拆分文本,我没有检查是否有一个单词的空格。我的RichTextBox有固定的大小,我很好。行中有18个字符没有问题,但问题在于计算行数,因为它并不像计算新行字符那么简单。

我想改变行为的原因是因为后来我必须逐行发送这个文本。手动计算一行中适合多少个单词并动态创建行似乎很容易,但它是错误的。

RichTextBox有非常有用的方法GetLineFromCharIndex。通过将Text.Count()传递给它,我可以确定我有多少实际行。现在我的代码比以前短两倍,似乎没有更大的错误。逐行发送文本并不是那么容易,因为我需要在读取字符时手动计算我在哪行,但总的来说,它比以前的解决方案更容易接受。