我试图找到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
答案 0 :(得分:1)
您已经查看过的microsoft文档中已提到:
如果pt参数中指定的位置在客户端之外 控件的区域,即最接近字符串的字符串的第一个字符 返回pt中指定的点。
因此,您需要将RichTextBoX
控件的工作区拐角处的点作为ClientSize
处的点:
char fullHeightChar = rtb.GetCharFromPosition(new Point(rtb.ClientSize));