Использование автозаполнения панели ввода
В Windows Vista панель ввода планшетного компьютера интегрирует новые возможности автозаполнения, которые позволяют обновлять список автозавершения приложения в режиме реального времени при распознавании рукописного ввода пользователя на панели ввода. Кроме того, список автозаполнения приложения расположен в удобном месте для пользователей панели ввода. Без автозаполнения панели ввода использование функций автозаполнения с панелью ввода является сложным процессом, требующим вставки одного символа за раз и перемещения панели ввода для доступа к предложениям автозаполнения. Благодаря интеграции автозавершение — это мощное средство для пользователей планшетных компьютеров, которое ускоряет и упрощает ввод текста с помощью панели ввода.
Существует три способа использования преимуществ автозавершения панели ввода в приложении. Приложения, содержащие функции автозаполнения, созданные с помощью автозаполнения оболочки (через интерфейс IAutoComplete) или платформа .NET Framework автозаполнения (с помощью перечисления AutoCompleteMode), получают интеграцию автозаполнения панели ввода без необходимости изменения кода. Приложения, включающие настраиваемые текстовые поля автозаполнения, могут использовать API автозаполнения панели ввода для получения той же функциональности.
Во всех случаях эти изменения можно вносить в список автозавершения приложения без дублирования или изменения пользовательского интерфейса или логики прогнозирования, используемой приложением для создания списка автозаполнения. Список автозаполнения по-прежнему является владельцем, нарисованным приложением, и содержимое списка Автозаполнение совпадает с тем, что если бы текст был введен непосредственно в поле редактирования.
Интеграция автозаполнения панели ввода поддерживается в операционной системе Windows Vista или более поздних версиях. Интеграция автозаполнения панели ввода встроена в автозавершение оболочки, начиная с Windows Vista, и в разработку Windows Forms начиная с платформа .NET Framework версии 3.0. Хотя IAutoComplete и AutoCompleteMode работают в более ранних версиях Windows, интеграция автозаполнения панели ввода не поддерживается в Microsoft Windows XP Tablet PC Edition и более ранних операционных системах. Если вы запускаете автозавершение панели ввода на более ранних версиях планшетного пк, приложения отменить изменения к поведению перед интеграцией.
Причины интеграции списков автозаполнения приложений с панелью ввода
Интеграция списка автозаполнения приложения обеспечивает максимальную простоту и скорость ввода для пользователей, которые вводят текст в текстовое поле, включающее функции автозаполнения. Кроме того, приложение, включающее интеграцию автозавершения панели ввода, сразу же отображается так, как если бы оно было разработано с учетом планшетного компьютера, что делает приложение более привлекательным для пользователей планшетных компьютеров.
Взаимодействие панели ввода и списка автозаполнения без интеграции
Использование панели ввода для ввода текста в текстовое поле, включающее список автозаполнения, но не интегрированное с панелью ввода:
- Пользователь помещает фокус в текстовое поле и открывает панель ввода.
- Пользователь записывает один или два символа.
- Пользователь нажимает кнопку Вставить. Панель ввода вводит текст в текстовое поле приложения. Появится список автозаполнения приложения, который, скорее всего, частично или полностью скрыт панелью ввода.
- Пользователь перетаскивает панель ввода, чтобы открыть список автозавершения приложения.
- При условии, что правильная запись включена в список автозаполнения, пользователь теперь может выбрать эту запись; В противном случае пользователь должен повторить шаги 2 и 3.
Это явно громоздкий процесс. Ожидания пользователя в том, как должен работать список автозаполнения, являются пунктирными, и их способность выполнять задачи снижается.
Как улучшается взаимодействие с панелью ввода и списком автозаполнения с интеграцией
Использование панели ввода для ввода текста в текстовое поле, содержащее список автозаполнения, интегрированный с панелью ввода:
- Пользователь помещает фокус в текстовое поле и открывает панель ввода.
- Пользователь записывает один или два символа. Список автозаполнения приложения отображается непосредственно над или непосредственно под панелью ввода, когда пользователь записывает текст.
- Пользователь выбирает запись из списка Автозавершение; запись вставляется непосредственно в текстовое поле приложения или пользователь повторяет шаг 2, пока не появится правильная запись.
В связи с интеграцией список автозаполнения отображается и обновляется, пока пользователь пишет на панели ввода. Кроме того, список расположен таким образом, чтобы он был удобным для пользователя для доступа во время записи и не был скрыт панелью ввода. Наконец, когда пользователь выбирает элемент из списка автозаполнения, он вставляется непосредственно в текстовое поле приложения, что позволяет пользователю обойти шаг вставки текста на панели ввода.
Стандартные компоненты автозаполнения, включающие интеграцию автозаполнения панели ввода
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 , передавая значение 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, но также может вызываться клиентом автозаполнения в любое время. После получения этого вызова поставщик автозаполнения должен скрыть или отобразить поставщик автозаполнения, как указано в параметре . Перед отображением списка автозаполнения поставщик автозаполнения должен обратиться к клиенту автозаполнения о расположении списка автозаполнения. Дополнительные сведения о расположении списка автозаполнения см. далее в этой статье.
Затем приложение должно использовать функцию CoCreateInstance библиотеки active Template Library (ATL) для создания экземпляра интерфейса ITipAutocompleteClient с идентификатором класса CLSID_TipAutoCompleteClient в качестве внутрипроцессного сервера, а затем зарегистрировать поставщик в клиенте. Метод ITipAutocompleteClient::AdviseProvider клиента автозаполнения регистрирует поставщик в клиенте, чтобы клиент мог вызывать объект поставщика автозаполнения приложения. Если tiptsf.dll отсутствует в системе, функция CoCreateInstance завершается сбоем и возвращает REGDB_E_CLASSNOTREG. На этом этапе приложение может отменить свой объект ITipAutocompleteProvider и продолжить работу, как если бы панель ввода не существует, так как она не работает в такой системе.
Приложение может создать один экземпляр ITipAutocompleteClient или один экземпляр для каждого текстового поля. Первый вариант требует отмены регистрации и регистрации поставщика при каждом изменении фокуса. Дополнительные сведения об отмене регистрации поставщика автозаполнения см. далее в этом разделе.
Существует несколько шагов, связанных с размещением списка автозаполнения, которые должны быть согласованы между поставщиком автозаполнения (приложением) и клиентом автозаполнения (панель ввода). Перед отображением списка автозаполнения в результате вызова метода Show поставщика автозавершения или из-за ввода пользователем текста с помощью клавиатуры поставщик должен обратиться к клиенту о расположении списка автозаполнения. Поставщик должен выполнить следующие действия.
Используйте метод ITipAutocompleteClient::RequestShowUI клиента автозаполнения, чтобы определить, готова ли панель ввода к отображению списка Автозаполнения. RequestShowUI принимает параметр HWND , который является HWND для окна списка автозаполнения, а метод возвращает значение TRUE или FALSE , чтобы указать, является ли он состоянием, в котором может отображаться список автозаполнения. Если клиент возвращает значение FALSE, поставщик не должен пытаться отобразить список автозаполнения.
Вызовите RequestShowUI , чтобы задать дескриптор всплывающего окна списка автозаполнения перед вызовом метода ITipAutocompleteClient::P referredRects. В противном случае при вызове PreferredRects возникает ошибка E_INVALIDARG.
Если Параметр RequestShowUI возвращает значение TRUE, поставщик должен вычислить прямоугольник координат экрана по умолчанию списка автозаполнения на основе расположения поля ввода текста, а затем вызвать метод ITipAutocompleteClient::P referredRects клиента автозаполнения. Это позволяет клиенту автозаполнения настроить прямоугольник, чтобы список автозаполнения не перекрывал панель ввода. Метод PreferredRects принимает четыре параметра:
- RECT rcACList: прямоугольник координат экрана по умолчанию списка автозаполнения.
- RECT rcField: прямоугольник координат экрана соответствующего текстового поля ввода.
- RECT *prcModifiedACList: скорректированный прямоугольник с координатами экрана для автозаполнения.
- BOOL *pfShowAbove: этот параметр указывает поставщику, размещает ли прямоугольник prcModifiedACList список автозаполнения над или под панелью ввода. Приложение может использовать эти сведения для правильного рисования элементов пользовательского интерфейса, таких как маркеры изменения размера и полосы прокрутки. Поставщик должен изначально передавать направление, в которое список автозаполнения будет располагаться относительно текстового поля ввода с помощью rcACList. Клиент не изменяет pfShowAbove, если для параметра prcModifiedACList задано значение rcACList.
Используйте возвращаемые значения аргументов prcModifiedACList и pfShowAbove out, чтобы расположить и отобразить окно списка автозаполнения. Если панель ввода не используется, 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-интерфейсов для обеспечения того же интегрированного взаимодействия с приложениями, которые используют пользовательские элементы управления автозавершение.
Связанные темы