当插入符号在最后一个位置时,EM_POSFROMCHAR没有返回正确的值

EM_POSFROMCHAR not returning proper value when caret is at the last position

本文关键字:POSFROMCHAR 返回 EM 符号 插入 最后一个 位置      更新时间:2023-10-16

我正面临一个奇怪的问题与EM_POSFROMCHAR

我试图在文本控件中获得当前插入符号位置的客户端区域坐标。这适用于所有其他场景,但是当插入符号位于最后一个位置时总是返回-1

我在一个c++应用程序(wxWidgets)中这样做。但为了方便在这里发布,我做了一个c++/CLI端口。下面是相关代码(为简单起见,删除了提取LOWWORD和HIWORD的代码)。

HWND handle = (HWND) textControl->Handle.ToPointer();
LRESULT rc = ::SendMessage(handle, EM_POSFROMCHAR, textControl->SelectionStart, 0);
MessageBox::Show(rc.ToString());

总是返回-1。我试图通过textControl->SelectionStart - 1,它给出了一个适当的值。由于某种原因,这对最后一个职位不起作用。这在RichText控件中工作得很好。

我发现。net框架为托管客户端提供了一个API。TextBoxBase.GetPositionFromCharIndex。这个函数也会产生与上面解释的相同的结果。我用反射器看了看,他们使用相同的代码来获取位置。

我有以下几个问题。

  1. 为什么当插入符号在最后一个位置时,我没有得到正确的值?
  2. 如果这是EM_POSFROMCHAR的问题,解决这个问题的方法是什么?

我的目的是在插入符号位置显示上下文菜单,而用户键入文本。类似于visual studio的东西。

任何帮助都会很感激。

我假设'在最后一个位置'你的意思是在最后一个可见字符后面?

如果字符是行分隔符,则返回的坐标指示在行中最后一个可见字符后面的点。如果指定的索引大于控件中最后一个字符的索引,则该控件返回-1。

按照这个逻辑,如果你有一个编辑控件,比如说2行,并且你在第1行最后一个字符之后给它索引,它会计算换行字符的坐标。在最后一行或单行编辑控件中没有这样的字符。

至于变通方法,我认为编辑控制消息的方法并不多。不过你可能想看看GetCaretPos