使用文本框尺寸时,RichTextBox.GetCharFromPosition返回不正确的字符

时间:2018-11-07 19:03:16

标签: c#

我试图找到RichTextBox中可见的文本的开始和结束字符。为了找到起点,我将坐标(0,0)传递给RichTextBox.GetCharFromPosition(Point),它返回可见的第一个字符。在下面的代码块中,它返回“ a”,这是正确的。

问题是当我尝试找到最后一个字符时。为了找到最后一个字符,我尝试使用控件的宽度和高度作为坐标,这样它将返回最接近右下角的字符,该字符应该是最后一行的最右字符。 RichTextBox继承的TextBoxBase.GetCharFromPosition的备注部分指出:

  

如果pt参数中指定的位置在控件的客户区之外,则返回最接近pt中指定点的字符串的第一个字符。[0]

当我传入控件的宽度和高度作为点时,它将返回最后一行的 first 字符,而不是最后一行的 last 字符即使最后一个字符应更靠近拐角,也要对齐。在下面的示例中,它返回“ g”而不是“ i”。

令人困惑的是,当我从高度减去4时,将返回正确的字符。如果减去1,2或3,它将返回“ i”,但大于3则返回“ g”。对于大于高度的任何数字,它仍将返回“ i”。

我的最佳猜测是与控件边框的大小有关,并从控件内部而不是边缘或外部减去4个度量。 RichTextBox.GetCharIndexFromPosition(Point)[1]也发生相同的情况,在该处它将返回第一个字符的索引,而不是最后一行的最后一个字符。知道这里发生了什么吗?

RichTextBox rtb=new RichTextBox();
rtb.Width=300;
rtb.Height=100;
rtb.Text="abc"+"\n"+"def"+"\n"+"ghi";
/* Text will look like:
   abc
   def
   ghi
*/
//This one behaves correctly.
char firstCharacter=rtb.GetCharFromPosition(new Point(0,0));
Assert.AreEqual('a',firstCharacter);

//This uses rtb.Height and will return the incorrect character.
char fullHeightChar=rtb.GetCharFromPosition(new Point(rtb.Width,rtb.Height));
Assert.AreEqual('g',fullHeightChar);

//This uses a number much greater than rtb.Height
char largeHeightChar=rtb.GetCharFromPosition(new Point(rtb.Width,500));
Assert.AreEqual('g',largeHeightChar);

//This one uses (rtb.Height-4) and returns the correct character.
char subHeightChar=rtb.GetCharFromPosition(new Point(rtb.Width,rtb.Height-4));    
Assert.AreEqual('i',subHeightChar);

[0] https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.textboxbase.getcharfromposition?view=netframework-4.7.2 [1] https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.richtextbox.getcharindexfromposition?view=netframework-4.7.2

1 个答案:

答案 0 :(得分:1)

您已经查看过的microsoft文档中已提到:

  

如果pt参数中指定的位置在客户端之外   控件的区域,即最接近字符串的字符串的第一个字符   返回pt中指定的点。

因此,您需要将RichTextBoX控件的工作区拐角处的点作为ClientSize处的点:

char fullHeightChar = rtb.GetCharFromPosition(new Point(rtb.ClientSize));