【问题标题】:Getting a string index based on a pixel offset根据像素偏移量获取字符串索引
【发布时间】:2011-09-06 12:31:04
【问题描述】:

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

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

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

额外信息:我通过将行存储在列表中然后迭代列表并在每一行上使用Graphics.DrawString 来绘制文本。

【问题讨论】:

    标签: c# graphics textbox drawing measurement


    【解决方案1】:

    没有简单的方法可以在像素处找到字符。

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

    注意:您可能会看到 Graphics.MeasureString 方法并很想使用它。不!该方法不会返回准确的测量值。我不记得为什么了,但如果你尝试一下,你就会全力以赴!

    【讨论】:

    • 所有文本编辑器都必须这样做吗?也就是说,RichTextBox 是这样做的吗?看起来很hackish。
    • RichTextBox 有一个 GetCharFromPosition 方法。这使用原生 Windows API 消息来获取字符索引。
    • 有什么方法可以使用它吗?底层 API 消息是怎么做的?
    • 恐怕不会,除非您希望使用 Windows 文本框控件。就我们而言,底层 API 消息只是巫术。
    • 如果您自定义绘制自己的文本框,您可能需要查看SharpDevelop 项目。他们的来源是可用的,还有一本关于它是如何编码的深入书籍。特别是查看 ICSharpCode.TextEditor 项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多