如何在std::字符串中获得正确的位置
How to get correct position in the std::string?
我正在创建一个自定义单行编辑控件,在windows 7上的win32 api中使用自定义字体,字体不是固定宽度的字体,我需要根据鼠标点击移动插入符号,编辑控件不是空的,如果我知道鼠标点击在窗口内的水平位置,我如何计算需要将插入符号移动到的字符数?
我真的没办法,如果是固定宽度的字体,我会用平均字符宽度划分鼠标的水平点击位置,这会更简单,用非固定宽度的字形做同样的事情,很容易出错。
考虑到它是一个单行控件,您可能不打算使用超长的输入(至少在正常情况下)。在这种情况下,一种可能性是只将字符位置存储在数组(或向量等)中。然后,您可以在该数组中使用(例如)二进制搜索来查找字符位置。当然,即使对于较长的字符串,也可以这样做——尽管这会大大增加存储需求。
这是一个常见的问题。本质上,你是在尝试对文本进行点击测试,为此,你需要文本中每个字符在屏幕上的位置。
我的首选策略是计算一个RECT数组,显示文本的每个字符一个。添加或删除文本时需要更新数组,但它可以轻松处理单行或多行。函数GetCharWidth32检索DC中选择的特定字体的文本字符串的所有宽度。对于单行,一个调用就足够了,并且计算RECT数组也很简单。做多行并不难。
处理鼠标向下的消息,在数组中循环并找到正确的字符。强力搜索已经足够快了。
这种方法很简单,很容易推广到一系列类似的问题。
相关文章:
- 确保编译时的特定 std::array 位置
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- 内存位置出现Microsoft C++异常:std::out_of_range
- 从十六进制到双的转换始终导致内存位置的 std::out_of_range
- 移动 std::bitset<N> 是否超过 N 个位置未定义的行为?
- 错误:内存位置的 std::length_error
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- 查找 std::integer_sequence 中首次出现的值的位置
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C 获取std :: out_of_range异常的位置
- C++ std::map 如何按索引位置访问密钥
- 如何使用行位置在std :: ifstream中导航
- C++例外:内存位置 0x003DF4C0 处的 std::out_of_range
- 访问 std::string 中的元素,其中字符串的位置大于其大小
- 如何使用 std::find 找到元素的所有位置?
- 有没有一种方法可以在std::向量的特定位置重复插入元素
- 获取设置故障位的流位置 / std::ios::抛出故障
- std::ostringstream将标志放在错误的位置
- C++命名空间std的定义方式/位置(文档/标准链接)
- 如何使用regex_token_iterator<std::string::iterator>通过迭代器本身获取子匹配的原始字符串的位置?