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


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

В Windows Vista Панель ввода планшетного ПК включает новые возможности автозаполнения, которые позволяют списку автозаполнения приложения обновляться в режиме реального времени по мере распознавания рукописного ввода в Панели ввода. Кроме того, список автозаполнения приложения расположен в удобном расположении для пользователей панели ввода. Без использования автозаполнения панели ввода, использование функций автодополнения с панелью ввода становится сложным процессом, требуя от пользователей ввода по одному символу и перемещения панели ввода для доступа к предложениям автодополнения. При интеграции автозаполнение — это мощное средство для пользователей планшетного компьютера, которое ускоряет и повышает удобство ввода текста с помощью панели ввода.

панель ввода со списком автозаполнения IE

Существует три варианта того, как приложение может воспользоваться интеграцией автозавершения панели ввода. Приложения, содержащие функциональность автозаполнения, построенную с использованием автозаполнения оболочки (через интерфейс IAutoComplete) или автозаполнение .NET Framework (через перечисление AutoCompleteMode ), получают интеграцию автозаполнения панели ввода текста без необходимости изменять код. Приложения, включающие настраиваемые текстовые поля автозавершения, могут использовать API автозаполнения панели ввода для получения той же функциональности.

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

Интеграция автозавершения панели ввода поддерживается в операционной системе Windows Vista или более поздних версиях. Интеграция автозавершения панели ввода встроена в автозаполнение оболочки начиная с Windows Vista и в разработку Windows Forms, начиная с .NET Framework версии 3.0. Хотя IAutoComplete и AutoCompleteMode оба запускаются в более ранних версиях Windows, интеграция автозаполнения панели ввода не поддерживается в Microsoft Windows XP Tablet PC Edition или более ранних операционных системах. Если вы запускаете автозавершение панели ввода на более ранних версиях планшетного компьютера, приложения будут возвращаться к поведению предварительной интеграции.

Причины интеграции списков автозаполнения приложений с панелью ввода

Интеграция списка автозавершения приложения обеспечивает максимальную простоту и скорость ввода для пользователей, которые вводят текст в текстовое поле, включающее функции автозаполнения. Кроме того, приложение, включающее интеграцию автозаполнения панели ввода, сразу же появляется так, как если бы оно было разработано с помощью планшетного компьютера, что делает приложение более привлекательным для пользователей планшетного компьютера.

Как панели ввода и списки автозаполнения взаимодействуют без интеграции

Использование панели ввода для ввода текста в текстовое поле, которое включает список автодополнения, но не интегрировано с панелью ввода:

  1. Пользователь помещает фокус в текстовое поле и открывает панель ввода.
  2. Пользователь записывает один или два символа.
  3. Пользователь нажимает Вставка. Панель ввода вводит текст в текстовое поле приложения. Появится список автозаполнения приложения, который, скорее всего, частично или полностью затенен панелью ввода.
  4. Пользователь перетаскивает панель ввода, чтобы открыть список автозаполнения приложения.
  5. При условии, что правильная запись включена в список автозавершения, пользователь теперь может выбрать эту запись; В противном случае пользователь должен повторить шаги 2 и 3.

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

Как интеграция улучшает взаимодействие с панелью ввода и списком автозавершения

Использование панели ввода для ввода текста в текстовое поле, включающее список автозаполнения, интегрированный с панелью ввода:

  1. Пользователь помещает фокус в текстовое поле и открывает панель ввода.
  2. Пользователь записывает один или два символа. Список автозавершения приложения отображается непосредственно над панелью ввода или непосредственно под панелью ввода, когда пользователь записывает текст.
  3. Пользователь выбирает запись из списка автозаполнения; запись вставляется непосредственно в текстовое поле приложения или пользователь повторяет шаг 2, пока не появится правильная запись.

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

панель ввода со списком автозаполнения Outlook Express

Стандартные компоненты автозаполнения, включающие интеграцию автозаполнения панели ввода

Оба IAutoComplete и AutoCompleteMode включают встроенную интеграцию автозаполнения панели ввода. Приложения, использующие любой из этих стандартных компонентов автозавершения, могут воспользоваться функциональными возможностями автозавершения панели ввода без дополнительных работ. Кроме того, в то время как автозавершение панели ввода поддерживается только в Windows Vista или новых версиях операционной системы Windows, приложения, созданные с помощью IAutoComplete до выпуска Windows Vista, автоматически получают интеграцию автозавершения панели ввода при запуске в Windows Vista. В следующих разделах содержатся дополнительные сведения о конкретных элементах IAutoComplete и AutoCompleteMode, которые включают интеграцию автозаполнения панели ввода.

Автозавершение в оболочке с интеграцией автозаполнения панели ввода

Приложения, использующие IAutoComplete, получают интеграцию с функцией автозаполнения панели ввода бесплатно. Хотя API автозаполнения оболочки включены в Windows 2000, интеграция автозаполнения панели ввода поддерживается только в Windows Vista и более новых версиях. Однако приложения, созданные до выпуска Windows Vista, которые используют IAutoComplete, автоматически получают интеграцию автозаполнения панели ввода при запуске на Windows Vista.

Чтобы воспользоваться преимуществами автозаполнения планшета таким образом, необходимо использовать объект автозаполнения (CLSID_Autocomplete). Если вы хотите предоставить функцию автозаполнения для URL-адресов или имен файлов, используйте функцию SHAutoComplete для создания объекта автозаполнения.

Помимо IAutoComplete, вы можете реализовать IAutoComplete2 или IAutoCompleteDropDownнапрямую, и автоматически получать интеграцию с функцией автозаполнения панели ввода.

Интеграция автозавершения панели ввода с приложениями .NET Framework

Начиная с .NET Framework 3.0 текстовые поля Windows Forms включают автозавершение. Автозаполнение текстового поля Windows Forms построено на основе автозаполнения оболочки, что означает, что интеграция автозаполнения панели ввода также встроена. Платформа .NET Framework 3.0 поддерживается в более ранних версиях Windows, выпущенных до Windows Vista. Однако, так как интеграция автозавершения панели ввода поддерживается только в Windows Vista или более поздних версиях, интеграция автозавершения панели ввода работает только в приложении .NET Framework 3.0 при установке в Windows Vista или более поздних версиях.

Приложения, желающие воспользоваться интеграцией функции автозаполнения Панели Ввода в .NET Framework 3.0, должны использовать Windows Forms TextBox со свойством AutoCompleteMode. Для использования интеграции автозаполнения панели ввода не требуется выполнять каких-либо дополнительных действий, кроме как настроить автозаполнение Windows Forms.

Использование API автозаполнения панели ввода напрямую

Разработчикам настраиваемых автозаполняемых текстовых полей необходимо работать с API автозаполнения панели ввода напрямую, чтобы получить улучшенный опыт ввода текста, который обеспечивается интеграцией автозаполнения через панель ввода в их приложениях. Api автозаполнения панели ввода включены в операционную систему Windows Vista и в составе пакета SDK для планшетной платформы версии 1.9 или более поздней. Интерфейсы автозавершения панели ввода — это интерфейсы на основе COM.

В следующем разделе подробно описаны эти интерфейсы для приложения C++. Однако эти COM-интерфейсы можно реализовать на большинстве языков, включая C#, с помощью COM-взаимодействия.

Чтобы реализовать интеграцию автозаполнения панели ввода в пользовательском текстовом поле автозавершения, требуются два интерфейса: интерфейс ITipAutocompleteProvider и интерфейс ITipAutocompleteClient. Определения этих интерфейсов находятся в TipAutoComplete.h и TipAutoComplete_i.c.

Сначала приложение должно определить и создать экземпляр класса поставщика автозаполнения, который реализует ITipAutocompleteProvider для каждого текстового поля, включающего список автозаполнения. Этот класс управляет интерфейсом приложения для интеграции автозаполнения. Все запросы автозаполнения из панели ввода отправляются от клиента автозаполнения в приложение через поставщика автозаполнения приложения. Поставщик автозаполнения приложения должен иметь доступ к HWND для списка автозаполнения приложения и HWIND для связанного текстового поля. Кроме того, необходимо реализовать следующие методы ITipAutocompleteProvider:

  • метод ITipAutocompleteProvider::UpdatePendingText: этот метод используется клиентом автозаполнения для уведомления приложения о тексте, который пользователь ввел в Панель ввода. При получении этого уведомления поставщик отвечает за создание списка автозаполнения, как если бы текст был введен в текстовое поле приложения. Строка передается поставщику автозаполнения посредством метода ITipAutocompleteProvider::UpdatePendingText и включает только текст, в настоящее время находящийся в панели ввода. Таким образом, если в поле записи текста есть дополнительный текст, поставщик должен правильно добавить его в текст, отправленный клиентом. Строка, передаваемая методу ITipAutocompleteProvider::UpdatePendingText, должна рассматриваться как замена текущего выбора в поле. Если текущего выделения нет, его следует поместить в положение текущей точки вставки. После создания списка автозаполнения поставщик должен вызвать метод ITipAutocompleteProvider::Show Method передачу TRUE для отображения списка автозаполнения. Приложение не должно кэшировать вызовы UpdatePendingText, а не обрабатывать каждый дополнительный вызов UpdatePendingText как отмену предыдущего вызова, чтобы избежать вспышки устаревшего пользовательского интерфейса списка автозаполнения. В следующем примере кода показаны эти методики.

    HRESULT SampleProvider::UpdatePendingText(BSTR bstrPendingText)
    {
       //Discard previously cached pending text from Input Panel
       m_bstrPending.Empty();
        //Store the new pending text from Input Panel as m_bstrPending
    m_bstrPending = bstrPendingText;
    
        //Get the text from the field in two chunks. The characters to
    //the left of the selection and the characters to the right.
    CComBSTR bstrLeftContext = //Text to the left of the selection
            CComBSTR bstrRightContext = //Text to the right of the selection
    
    //Discard previously cached complete text
        m_bstrCompleteText.Empty();
        //Append to the field text from the left of the selection
        //the text from Input Panel and then append to that
        //the field text to the right of the selection
        m_bstrCompleteText.Append(bstrLeftContext);
        m_bstrCompleteText.Append(m_bstrPending);
        m_bstrCompleteText.Append(bstrRigtContext);
    
        //Update the app's AC list based on m_bstrCompleteText
        //...
    
        //Show the updated AC list by calling the provider's Show method
       Show(true);
       return S_OK;
    }
    
  • метод ITipAutocompleteProvider::Show: этот метод вызывается из UpdatePendingText, но также может вызываться клиентом автозаполнения в любое время. При получении этого вызова поставщик автозаполнения должен скрыть или показать поставщик автозаполнения, как указано параметром. Перед отображением списка автозаполнения поставщик автозаполнения должен обратиться к клиенту автозаполнения, чтобы узнать, где разместить список. Дополнительная информация о расположении списка автозаполнения представлена позже в этой статье.

Затем приложение должно использовать функцию Active Template Library (ATL) CoCreateInstance для создания экземпляра интерфейса ITipAutocompleteClient с идентификатором класса CLSID_TipAutoCompleteClient в качестве внутреннего сервера, а затем зарегистрировать поставщика для клиента. Клиент автозаполнения метод ITipAutocompleteClient::AdviseProvider регистрирует поставщика у клиента, чтобы дать возможность клиенту вызывать объект автозаполнения приложения. Если tiptsf.dll отсутствует в системе, функция CoCreateInstance завершается ошибкой и возвращает REGDB_E_CLASSNOTREG. На этом этапе приложение может отменить свой объект ITipAutocompleteProvider и продолжить, как если бы панель ввода не существовала, поскольку она действительно отсутствует в такой системе.

Приложение может выбрать создание одного экземпляра ITipAutocompleteClient или одного экземпляра на каждое текстовое поле. Первый вариант требует, чтобы поставщик каждый раз при изменении фокуса был сначала снят с регистрации, а затем зарегистрирован снова. Дополнительные сведения об отмене регистрации поставщика автозаполнения отображаются далее в этом разделе.

Существует несколько шагов, связанных с размещением списка автозаполнения, которые должны быть согласованы между поставщиком автозаполнения (приложением) и клиентом автозаполнения (панель ввода). Перед отображением списка автозаполнения в результате вызова метода автозаполнения поставщика Показать или из-за ввода текста с помощью клавиатуры поставщику необходимо обратиться к клиенту о том, где разместить список автозаполнения. Поставщик должен выполнить следующие действия.

  • Используйте клиент автозаполнения ITipAutocompleteClient::RequestShowUI для определения готовности панели ввода к отображению списка автозаполнения. RequestShowUI принимает параметр HWND, который является HWND для окна списка автозаполнения, а метод возвращает TRUE или FALSE, чтобы указать, является ли это состоянием, в котором можно отобразить список автозаполнения. Если клиент возвращает FALSE, поставщик не должен пытаться отобразить список автозаполнения.

  • Вызовите RequestShowUI, чтобы задать дескриптор окна списка всплывающего окна автозаполнения перед вызовом метода ITipAutocompleteClient::PreferredRects. Если этого не сделать, возникнет ошибка E_INVALIDARG при вызове PreferredRects.

  • Если RequestShowUI возвращает TRUE, поставщик должен вычислить прямоугольник координат экрана по умолчанию для списка автозавершения на основе расположения текстового поля, а затем вызвать метод PreferredRects клиента ITipAutocompleteClient::PreferredRects Method. Это позволяет клиенту автозаполнения изменить прямоугольник, чтобы избежать перекрытия списка автозаполнения с панелью ввода. Метод PreferredRects принимает четыре параметра:

    • RECT rcACList: прямоугольник координат экрана по умолчанию списка автозаполнения.
    • RECT rcField: прямоугольник координат экрана соответствующего поля записи текста.
    • RECT *prcModifiedACList: скорректированный прямоугольник экранных координат для Автозаполнения
    • BOOL *pfShowAbove: этот параметр указывает поставщику, размещает ли прямоугольник prcModifiedACList список автозаполнения выше или ниже панели ввода. Приложение может использовать эти сведения для правильного рисования элементов пользовательского интерфейса, такие как ручки изменения размера и полосы прокрутки. Поставщик должен изначально указать направление, в котором будет размещаться список автозаполнения относительно текстового поля, rcACList. Клиент не изменяет pfShowAbove, если он задает prcModifiedACList равным rcACList.

    Используйте возвращаемые значения prcModifiedACList и результирующие аргументы pfShowAbove для расположения и отображения окна списка автозаполнения. Если панель ввода не используется, RequestShowUI всегда возвращает TRUE и prcModifiedACList всегда совпадает с rcACList. pfShowAbove также не изменяется, результатом является то, что вызовы не влияют на поведение приложения. В следующем примере кода показаны эти методики.

HRESULT SampleProvider::Show(BOOL fShow)
{
    //Ask the AC client if it is OK to show the Autocomplete list.
    BOOL fAllowShowing = FALSE;
    m_spACClient->RequestShowUI(m_hWndList, &fAllowShowing);

    if (fShow && fAllowingShowing)
        {
            // Create the parameters required to call PreferredRects
            RECT rcField = //Rectangle for app's text field
            RECT rcACList = //Default rectangle for app's AC list
            RECT rcModifiedACList = {0, 0, 0, 0};
            BOOL fShowAbove = TRUE;

//Ask the AC client to modify the position of the AC list
m_spACClient->PreferredRects(&rcACList, &rcField,
&rcModifiedACList, &fShowAbove);

            //Show the Autocomplete UI at the modified preferred rectangle
            //from rcModifiedACList and the directional info provide by
//fShowAbove
            //...
        }
    else
        {
        //Hide the Autocomplete list and clean up
        //...
        }
    return S_OK;
}

Когда пользователь выбирает элемент в списке автозаполнения, поставщику необходимо вызвать метод ITipAutocompleteClient::UserSelection помимо того, чтобы вставить выделенный текст элемента в поле для ввода текста. Панель ввода использует это уведомление, чтобы удалить весь оставшийся текст, который еще не был вставлен из Панели ввода.

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

Заключение

Интеграция автозаполнения панели ввода — это мощный инструмент для улучшения пользовательского опыта в приложениях Windows, включающих списки автозаполнения на планшетах. Без интеграции пользователи панели ввода должны пройти пустую процедуру вставки текста одного символа за раз и изменения положения панели ввода для использования автозаполнения. При интеграции списки автозаполнения отображаются в удобном месте, когда пользователи вводят текст на панели ввода, что увеличивает скорость и удобство ввода текста. В приложениях, которые включают функцию автозаполнения, созданную на основе автозаполнения оболочки или автозаполнения .NET Framework 3.0, интеграция автозаполнения панели ввода является бесплатной и привлекательной функцией. Кроме того, предоставляется простой набор интерфейсов на основе COM, чтобы обеспечить тот же интегрированный интерфейс для приложений, которые выбирают использование пользовательских элементов управления автозаполнения.

Справочник панели ввода текста