C# 基于像素偏移量获取字符串索引

C# 基于像素偏移量获取字符串索引,c#,graphics,textbox,drawing,measurement,C#,Graphics,Textbox,Drawing,Measurement,我正在自定义绘制一个文本框,现在我正在实现一个部分,用户可以单击一条线,并将光标移动到他单击的位置 我知道如何获取他点击的文本行,因为所有字体的字符高度都是恒定的,而不是列,因为我不知道如何说“获取在这个像素量之前可以绘制的所有文本”,并且因为字符宽度不一致,除非使用固定宽度字体,这不是保证 因此,我有了绘制字符串的点(0),然后我有了用户单击的点。如何获取他们单击的字符的字符串索引 额外信息:我通过在列表中存储行,然后迭代列表并在每行上使用图形来绘制文本。没有简单的方法在像素处查找字符 但是,

我正在自定义绘制一个文本框,现在我正在实现一个部分,用户可以单击一条线,并将光标移动到他单击的位置

我知道如何获取他点击的文本行,因为所有字体的字符高度都是恒定的,而不是列,因为我不知道如何说“获取在这个像素量之前可以绘制的所有文本”,并且因为字符宽度不一致,除非使用固定宽度字体,这不是保证

因此,我有了绘制字符串的点(
0
),然后我有了用户单击的点。如何获取他们单击的字符的字符串索引


额外信息:我通过在列表中存储行,然后迭代列表并在每行上使用
图形来绘制文本。

没有简单的方法在像素处查找字符

但是,您可以找到字符串将填充的像素。使用该方法。可以对字符串执行二进制搜索,直到找到MeasureCharacterRanges返回光标位置的字符串


注意:您可能会看到Graphics.MeasureString方法并尝试使用它。不要!这种方法不能返回准确的测量值。我不记得为什么了,但是如果你尝试的话,你会尽力的

所有的文本编辑器都必须这样做吗?就是说,RichTextBox是这样做的吗?RichTextBox有一个GetCharFromPosition方法。这使用本机windows API消息获取字符索引。有什么方法可以使用它吗?底层API消息是如何实现的?恐怕不行,除非您希望使用windows Textbox控件。就我们而言,底层的API消息只是巫毒。如果您正在自定义绘制自己的文本框,您可能希望查看该项目。他们的来源是可用的,还有一本关于它是如何编码的深入的书。特别是看ICSharpCode.TextEditor项目。