【问题标题】:How to get correct position in the std::string?如何在 std::string 中获得正确的位置?
【发布时间】:2014-04-11 17:03:49
【问题描述】:

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

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

【问题讨论】:

  • 自己尝试一些想法。如果它不起作用,请发布您的代码并解释您面临的问题。没有它,其他人很难提供帮助。
  • @RSahu 我真的没有想法,如果它是一个固定宽度的字体,我会用字符宽度划分鼠标的水平点击位置,这样会更简单,用 not a定宽字体,取平均字符宽度,容易出错。

标签: c++ winapi


【解决方案1】:

鉴于它是单行控件,您可能不打算处理极长的输入(至少通常是这样)。在这种情况下,一种可能性是将字符位置存储在数组(或向量等)中。然后您可以使用(例如)该数组中的二进制搜索来查找字符位置。当然,您也可以对更长的字符串执行相同的操作——尽管它会大大增加存储需求。

【讨论】:

  • 我会补充一点,可能填充这样的向量GetTextExtentPoint32 会派上用场。
  • @Matteo:在这种情况下,GetCharWidth32 (msdn.microsoft.com/en-us/library/windows/desktop/…) 可能更有用,因为它会检索每个字符的位置。我想这也可以在运行时完成,因为鼠标单击本身可以减少内存消耗。
  • @JerryCoffin 好主意,但会不会有点慢?我的意思是我们需要实时更新插入符号的位置。另外,如果有人复制粘贴了一个长字符串,计算每个字符的位置会花费很多时间。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-30
    • 2012-02-02
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多