如何在std :: string中获得正确的位置?

时间:2014-04-11 04:43:21

标签: c++ winapi

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

我真的没有想法,如果它是一个固定宽度的字体,我会将水平鼠标点击位置与平均字符宽度分开,这本来就更简单,做同样没有固定宽度的字体,很容易错误。

2 个答案:

答案 0 :(得分:1)

鉴于它是一个单行控制,你可能不打算使用非常长的输入(至少通常)。在这种情况下,一种可能性是将字符位置存储在数组(或向量等)中然后您可以使用(例如)该数组中的二进制搜索来查找字符位置。当然,即使是更长的字符串,你也可以做同样的事情 - 虽然它可以提高存储要求。

答案 1 :(得分:1)

这是一个熟悉的问题。您实际上是在尝试对文本进行命中测试,因此您需要在屏幕上显示文本的每个字符。

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

处理鼠标按下消息,遍历数组并找到正确的字符。蛮力搜索足够快。

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