c - 在 RichEdit Winapi 中实现 "tab completion"

标签 c winapi

这是您在许多 IRC 客户端中看到的功能。基本上,如果您输入字符串“Ad”,然后点击 Tab,客户端将填写第一个匹配的昵称(在 IRC 客户端的情况下)数学“Ad” - 所以假设它填写 Adam。但是,就像 bash 一样,如果您继续按 Tab 键,它应该循环显示所有包含“Ad”作为前缀的名称。

不过,我不太确定如何在 RichEdit 的 Wndproc 中实现这一点。具体来说,当用户点击选项卡时,我需要获取当前的“ token ”,保存它,并获取所有前缀并填写第一个。如果他再次点击制表符,我需要获取下一个前缀,依此类推,但是一旦我得到一个不是制表符的 WM_CHAR,我就需要清空前缀列表 - 我想?

我想知道是否有一些更简单、更简单的方法,或者是否有人见过这样做的代码?

谢谢。

最佳答案

尽管雷米的评论很有用,但在我看来,这个问题更多的是关于实现某种 bash 风格的自动完成的逻辑应该是什么,而不是其他任何问题。在此基础上,并根据您发布的内容(我发现有点令人困惑),我认为它应该是这样的(伪代码);

int autocomplete_index = 0;
string autocomplete_prefix;

on_tab:
    if (autocomplete_prefix == "")
    {
        autocomplete_prefix = current_contents_of_edit_field ();
        autocomplete_index = 0;
    }

    auto autocomplete_result = get_autocomplete_string (autocomplete_prefix, autocomplete_index++);
    if (autocomplete_result != "")
        replace_contents_of_edit_field_and_move_caret_to_end (autocomplete_result);
    else
        beep ();  // or cycle round
    done;

on_any_other_char:
    autocomplete_prefix = "";

如果丰富的编辑控件嵌入在对话框中,您还需要确保对话框管理器不会在您说话之前插入并抓取 VK_TAB。对于丰富的编辑控件,这种情况通常不会发生(尽管对于常规编辑控件会发生这种情况 - 见图),但如果是这样,您可以在 WndProc 中适本地处理 WM_GETDLGCODE (根据要求提供详细信息)。

还有“黑客”?为什么?我不这么认为。对我来说听起来是个好主意。

关于c - 在 RichEdit Winapi 中实现 "tab completion",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50750551/

相关文章:

c - C中的顺序归并排序

c++ - 在没有 va_* 的情况下使用省略号是否可以接受?

c - 为什么 putchar() 不输出版权符号而 printf() 输出版权符号?

c - C 中的 "this"指针(不是 C++)

c++ - 键盘输入程序中的退格功能

c++ - 将 TreeView 控件滚动到顶部

powershell - 如何使用 UIAutomation 单击 Paint 的保存按钮?

c - 使用 null 构造引用

c++ - 为什么我的计时器停止计时?

c++ - Gdiplus::Image::GetWidth() 和一堆其他 setter/getter 不应该是 "const"吗?