实施"标签完成"在RichEdit Winapi

时间:2018-06-07 21:40:53

标签: c winapi

这是您在许多IRC客户端中看到的功能。基本上,如果你输入一个字符串" Ad"然后点击标签,客户端将填写第一个匹配的缺口(在IRC客户端的情况下)数学'广告' - 所以让我们说它填补了亚当。但是,就像bash一样,如果你继续点击标签,它应该遍历所有包含" Ad"作为前缀。

我不太确定如何在Wndproc中为RichEdit实现这一点。具体来说,当用户点击标签时,我需要获取当前标记'保存,并获取所有前缀并填写第一个标记。如果他再次点击标签我需要获得下一个前缀,依此类推,但是当我得到WM_CHAR 标签时,我需要清空前缀列表 - 我想? / p>

我想知道是否有一些更容易,更少hacky的方式,或者是否有人看到代码执行此操作?

感谢。

1 个答案:

答案 0 :(得分:0)

虽然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。对于丰富的编辑控件通常不会发生这种情况(虽然它适用于常规编辑控件 - 如图所示),但如果确实如此,您可以在WndProc中正确处理WM_GETDLGCODE(详情请求)。

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