代码之家  ›  专栏  ›  技术社区  ›  FreeMemory

在RichEdit Winapi中实现“tab completion”

  •  0
  • FreeMemory  · 技术社区  · 6 年前

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

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

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

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   catnip    6 年前

    虽然雷米的评论很有用,但在我看来,这个问题更多的是关于 逻辑

    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中适当地(根据要求提供详细信息)。