Прочитать на английском

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


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

Автозавершение расширяет строки, которые были частично введены в элементе управления редактированием , в полные строки. Например, когда пользователь начинает вводить URL-адрес в элементе управления "Изменение адреса", внедренном на панели инструментов Windows Internet Обозреватель, функция автозаполнения расширяет строку на один или несколько полных параметров 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.

Автоматическое приложение

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

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

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

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

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

CLSID_ACLHistory

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

CLSID_ACLMRU

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

CLSID_ACListISF

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

Бывают случаи, когда вместо немедленного освобождения ресурсов может потребоваться сохранить указатели интерфейса на различные объекты, участвующие в автозавершении. В частности, это делается, если требуется динамически настраивать поведение автозаполнения. Чаще всего это происходит при использовании объекта CLSID_ACListISF, который выполняет автозавершение из пространства имен оболочки и имеет возможность (ACLO_CURRENTDIR) перечисления из текущего каталога. Например, при переходе к новой папке интернет-Обозреватель изменить текущий каталог адресной строки, поэтому параметры необходимо изменить динамически. Существует два способа указать каталог, который объект 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();
    }