Поделиться через


Использование автозаполнения

Автозавершение дополняет строки, которые были частично введены в элемент управления редактирования, до полных строк. Например, когда пользователь начинает вводить URL-адрес в элементе управления "Изменение адреса", внедренном на панели инструментов Windows Internet Explorer, автозавершение расширяет строку в один или несколько полных параметров URL-адреса, которые соответствуют существующей частичной строке. Часть строки URL-адреса, например "микрофон", может быть развернута на "https://www.microsoft.com" или "https://www.microsoft.com/windows". Автозавершение обычно используется с элементами управления редактирования или элементами управления с внедренным элементом управления редактирования, например элементом управления comboBoxEx.

Добавление функции автозаполнения в приложение

Приложение может добавлять функции автозаполнения в элемент управления редактирования двумя способами:

  • SHAutoComplete — это простая функция, которая автоматически заполняет путь к файлу или URL-адрес.
  • интерфейс IAutoComplete предоставляется объектом автозаполнения (CLSID_AutoComplete). Он позволяет приложениям инициализировать, включать и отключать объект. IAutoComplete позволяет более контролировать источники автозаполнения, включая возможность добавления пользовательского источника. Остальная часть этого раздела описывает использование IAutoComplete. См. в разделе "Как включить автозавершение вручную" конкретные примеры использования.

Режимы автозаполнения

При использовании IAutoCompleteавтозавершение может отображать завершенную строку в двух режимах: автозаполнение и автопредложение. Режимы независимы; вы можете включить один или оба варианта. Чтобы указать режим, вызовите IAutoComplete2::SetOptions.

автоаппенд

В режиме автоматического добавления автозавершение добавляет оставшуюся часть наиболее вероятной строки-кандидата к существующим символам и выделяет добавленные символы. Если пользователь продолжает вводить символы, они добавляются в существующую частичную строку. Если пользователь добавляет символ, идентичный следующему выделенному символу, выделение этого символа отключено. Остальные символы по-прежнему будут выделены. Если пользователь добавляет символ, который не соответствует следующему выделенному символу, автозаполнение пытается создать новую строку-предсказание на основе удлинённой частичной строки и добавляет оставшуюся часть новой строки-предсказания к текущей частичной строке. Если ни один кандидат не найден, отображаются только введенные символы, и поле редактирования ведет себя так, как если бы автозаполнение было отключено. Этот процесс продолжается до тех пор, пока пользователь не примет строку.

автозаполнение

В режиме автоподсказки автозавершение отображает выпадающий список с одной или несколькими предложенными полными строками под полем редактирования. Пользователь может выбрать одну из предлагаемых строк или продолжить ввод. По мере выполнения ввода раскрывающийся список может быть изменен на основе текущей частичной строки. Если задать флаг ACO_SEARCH в IAutoComplete2::SetOptions, автозаполнение предоставляет опцию внизу раскрывающегося списка для поиска текущей неполной строки. Этот параметр отображается даже при отсутствии предлагаемых строк. Если пользователь выбирает вариант поиска, приложение должно запустить поисковую систему, чтобы помочь пользователю.

Использование предопределенных источников автозаполнения

Автозавершение зависит от наличия источника, который предоставляет ему строки для сопоставления с частичной строкой пользователя. У вас есть возможность предоставить пользовательский источник автозаполнения, но некоторые из наиболее распространенных источников предоставляются системой.

CLSID_ACLHistory

Источник автозаполнения, соответствующий списку URL-адресов в журнале посещений пользователя.

CLSID_ACLMRU

Источник автозаполнения, который сопоставляется со списком URL-адресов в недавно используемом списке пользователя.

CLSID_ACListISF

Источник автозаполнения, соответствующий элементам в пространстве имен оболочки: файлы на компьютере пользователя, а также элементы в виртуальных папках, таких как панель управления.

Существуют случаи, когда, вместо того чтобы немедленно освобождать ресурсы, вы можете захотеть сохранить указатели интерфейса на различные объекты, участвующие в автозаполнении. В частности, это делается, когда требуется динамически настроить поведение автозаполнения. Наиболее распространенный случай этого происходит при использовании объекта CLSID_ACListISF, который выполняет автозаполнение из пространства имен оболочки и имеет опцию (ACLO_CURRENTDIR) перечисления элементов из текущего каталога. Например, при переходе к новой папке Internet Explorer изменяет текущий каталог адресной строки и поэтому необходимо динамически изменять параметры. Существует два способа указать каталог, который объект CLSID_ACListISF должен рассматриваться как текущий каталог:

В следующем примере предположим, что pal является указателем на интерфейс IACList объекта с CLSID_ACListISF:

  • Использование 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();
    }