首页 > 解决方案 > 在 RichEdit Winapi 中实现“选项卡完成”

问题描述

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

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

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

谢谢。

标签: cwinapi

解决方案


尽管 Remy 的评论很有用,但在我看来,这个问题更多的是关于实现某种 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在您这样做之前不会说话和打断。富编辑控件通常不会发生这种情况(尽管它适用于常规编辑控件 - 看图),但如果发生这种情况,您可以WM_GETDLGCODE在 WndProc 中进行适当处理(根据要求提供详细信息)。

和'hacky'?为什么?我不这么认为。对我来说听起来是个好主意。


推荐阅读