自定义文本框:高亮显示和选择

Custom Textbox: Highlighting and Selection

本文关键字:显示 选择 高亮 文本 自定义      更新时间:2023-10-16

我之前发布了一个类似的问题,但经过思考和测试,我认为我误解了答案,回答者也误解了我。原始问题在这里。我想人们认为我只是想突出字符串,我没有说明我的确切目的。所以,我现在会:

我最近一直在尝试使用GDI+在C++CLR中创建一个100%从头开始的文本框。当用户点击文本框时,我已经遇到了放置插入符号的挑战。通过简单的数学运算(他们点击的地方除以线宽),我可以算出他们点击了哪一行。但为了点击字符,我需要(除非有更好的方法)比较行中所有字符的边界矩形,并将插入符号放在鼠标适合的插入符号之前。为了做到这一点,我需要获得每个单个字符的精确边界,而不是整个字符串。

我已经尝试了一些东西,但似乎都不起作用:

  • Graphics::MeasureString不是任何人推荐的,也不是它给了我想要的
  • TextRenderer::MeasureText更准确,但还不够准确
  • 图形::MeasureCharacterRanges有32个字符cap,我预计有些行的长度会超过32个字符案例

我相信我不能使用这些方法,除非有办法绕过它们的局限性。我希望我把我的问题和期望的解决方案比以前清楚得多。

由于文本的紧排和抗锯齿方式,字符的边界取决于其左侧的所有字符。但是,您不需要知道每个字符的边界,只需要知道单击点两侧的边界。您可以通过二进制搜索找到它们——将字符串一分为二,测量它(使用TextRenderer::MeasureText),并确定它是在单击点的左侧还是右侧。不断缩小字符串的大小,直到只剩下一种可能性。