Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在std::string中获得正确的位置?_C++_Winapi - Fatal编程技术网

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

C++ 如何在std::string中获得正确的位置?,c++,winapi,C++,Winapi,我正在创建一个自定义单行编辑控件,在windows 7上的win32 api中使用自定义字体,字体不是固定宽度的字体,我需要根据鼠标单击移动插入符号,编辑控件不是空的,如果我知道鼠标单击在窗口内的水平位置,如何计算需要将插入符号移动到的字符数 我真的没主意了,如果是固定宽度字体,我会用平均字符宽度来划分水平鼠标点击位置,这会更简单,在没有固定宽度字体的情况下也这样做,很容易出错。考虑到它是一个单行控件,您可能不打算使用非常长的输入在这种情况下,一种可能是将字符位置存储在数组(或向量等)中,然后您

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


我真的没主意了,如果是固定宽度字体,我会用平均字符宽度来划分水平鼠标点击位置,这会更简单,在没有固定宽度字体的情况下也这样做,很容易出错。

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

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

我的首选策略是计算一个RECT数组,显示文本的每个字符对应一个。当添加或删除文本时,该数组需要更新,但它很容易处理一行或多行。函数GetCharWidth32检索选定到DC中的特定字体中的文本字符串的所有宽度。对于单行调用这就足够了,而且计算矩形数组也很简单。多行操作并不难

处理鼠标按下的消息,在数组中循环并找到正确的角色。蛮力搜索足够快


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

自己尝试一些想法。如果不起作用,请发布代码并解释您面临的问题。没有这些,其他人很难帮助。@RSahu我真的没有主意了,如果是固定宽度的字体,我会将鼠标水平点击位置分开如果使用字符宽度,则会更简单,如果使用非固定宽度的字体,使用平均字符宽度,则很容易出错。我将添加这一点,以填充这样一个向量,
GetTextExtentPoint32
可能会派上用场。@Matteo:在本例中,GetCharWidth32()可能更有用,因为它可以检索每个字符的位置。我想这也可以在运行时为鼠标单击本身完成,以减少内存消耗。@JerryCoffin这是个好主意,但不会有点慢吗?我的意思是我们需要实时更新插入符号位置。另外,如果有人复制粘贴了一个长字符串,它将我花了很多时间计算每个角色的位置。