如何在std::字符串中获得正确的位置

How to get correct position in the std::string?

本文关键字:位置 std 字符串      更新时间:2023-10-16

我正在创建一个自定义单行编辑控件,在windows 7上的win32 api中使用自定义字体,字体不是固定宽度的字体,我需要根据鼠标点击移动插入符号,编辑控件不是空的,如果我知道鼠标点击在窗口内的水平位置,我如何计算需要将插入符号移动到的字符数?

我真的没办法,如果是固定宽度的字体,我会用平均字符宽度划分鼠标的水平点击位置,这会更简单,用非固定宽度的字形做同样的事情,很容易出错。

考虑到它是一个单行控件,您可能不打算使用超长的输入(至少在正常情况下)。在这种情况下,一种可能性是只将字符位置存储在数组(或向量等)中。然后,您可以在该数组中使用(例如)二进制搜索来查找字符位置。当然,即使对于较长的字符串,也可以这样做——尽管这会大大增加存储需求。

这是一个常见的问题。本质上,你是在尝试对文本进行点击测试,为此,你需要文本中每个字符在屏幕上的位置。

我的首选策略是计算一个RECT数组,显示文本的每个字符一个。添加或删除文本时需要更新数组,但它可以轻松处理单行或多行。函数GetCharWidth32检索DC中选择的特定字体的文本字符串的所有宽度。对于单行,一个调用就足够了,并且计算RECT数组也很简单。做多行并不难。

处理鼠标向下的消息,在数组中循环并找到正确的字符。强力搜索已经足够快了。

这种方法很简单,很容易推广到一系列类似的问题。