使用自动完成

自动完成将编辑 控件 中部分输入的字符串扩展为完整的字符串。 例如,当用户开始在 Windows Internet Explorer 工具栏中嵌入的“地址编辑”控件中输入 URL 时,自动完成会将字符串扩展到一个或多个与现有分部字符串一致的完整 URL 选项。 部分 URL 字符串(如“mic”)可能会扩展为“https://www.microsoft.com"或“https://www.microsoft.com/windows"。 自动完成通常与编辑控件或具有嵌入式编辑控件的控件(如 ComboBoxEx 控件)一起使用。

向应用程序添加自动完成功能

应用程序可以通过两种方式向编辑控件添加自动完成功能:

  • SHAutoComplete 是一个简单的函数,可以自动完成文件路径或 URL。
  • IAutoComplete 接口由自动完成对象 (CLSID_AutoComplete) 公开。 它允许应用程序初始化、启用和禁用 对象。 IAutoComplete 允许对自动完成源进行更多控制,包括添加自定义源的功能。 本主题的其余部分讨论 IAutoComplete 的使用。 有关特定使用示例,请参阅 如何手动启用自动完成

自动完成模式

使用 IAutoComplete 时,自动完成可以在两种模式下显示已完成的字符串:autoappend 和 autosuggest。 这些模式是独立的;可以启用任一或两者。 若要指定模式,请调用 IAutoComplete2::SetOptions

Autoappend

在自动填充模式下,自动完成会将最可能的候选字符串的其余部分追加到现有字符,并突出显示追加的字符。 如果用户继续输入字符,则会将其添加到现有的分部字符串中。 如果用户添加的字符与下一个突出显示的字符相同,则会关闭该字符的突出显示。 其余字符仍将突出显示。 如果用户添加的字符与下一个突出显示的字符不匹配,则自动完成将尝试基于较大的分部字符串生成新的候选字符串,并将新候选字符串的其余部分追加到当前部分字符串。 如果找不到候选字符串,则仅显示键入的字符,并且编辑框的行为与不自动完成一样。 此过程一直持续到用户接受字符串。

自动建议

在自动建议模式下,自动完成会在编辑控件下方显示一个下拉列表,其中包含一个或多个建议的完整字符串。 用户可以选择其中一个建议的字符串,也可以继续键入。 随着键入的进行,下拉列表可能会根据当前部分字符串进行修改。 如果在 IAutoComplete2::SetOptions 中设置ACO_SEARCH标志,则 autocomplete 会在下拉列表底部提供一个选项来搜索当前部分字符串。 即使没有建议的字符串,也会显示此选项。 如果用户选择搜索选项,应用程序应启动搜索引擎来协助用户。

使用预定义的自动完成源

自动完成取决于是否具有一个源,该源为其提供与用户的分部字符串匹配的字符串。 可以选择提供自定义自动完成源,但系统提供了几个最常见的源。

CLSID_ACLHistory

与用户的“历史记录”列表中的 URL 列表匹配的自动完成源。

CLSID_ACLMRU

与用户“最近使用的”列表中的 URL 列表匹配的自动完成源。

CLSID_ACListISF

与 Shell 命名空间中的项匹配的自动完成源:用户计算机上的文件以及虚拟文件夹中的项目(例如控制面板)。

有时,你可能希望保留指向自动完成中涉及的各种对象的接口指针,而不是立即释放资源。 具体而言,这是在想要动态调整自动完成行为时完成的。 使用 CLSID_ACListISF 对象时,最常见的实例会发生,该对象从 Shell 命名空间自动完成,并且可以选择从当前目录 (ACLO_CURRENTDIR) 枚举。 例如,导航到新文件夹时,Internet Explorer 会更改地址栏的当前目录,因此需要动态更改设置。 可通过两种方式指定CLSID_ACListISF对象应视为当前目录的目录:

在下面,假设 pal 是指向 CLSID_ACListISF 对象的 IACList 接口的指针:

  • 使用 IPersistFolder

    若要告诉CLSID_ACListISF对象应将特定 ITEMIDLIST 视为当前目录,可以使用对象的 IPersistFolder 接口。 由于 ITEMIDLIST 可以引用虚拟文件夹,因此此方法比使用 ICurrentWorkingDirectory 更灵活。

    请注意,以下示例使用可简化参数列表的模板化 QueryInterface。

    IPersistFolder *ppf;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&ppf));   
    if (SUCCEEDED(hr))
    {
        hr = ppf->Initialize(pidlCurrentDirectory);
        ppf->Release();
    }
    
  • 使用 ICurrentWorkingDirectory

    若要为CLSID_ACListISF对象提供当前目录的路径,可以使用对象的 ICurrentWorkingDirectory 接口。

    WCHAR pwszDirectory[MAX_PATH] = L"C:\\Program Files";
    ICurrentWorkingDirectory *pcwd;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&pcwd));    
    if (SUCCEEDED(hr))
    {
        hr = pcwd->SetDirectory(pwszDirectory);
        pcwd->Release();
    }