Обработка входных данных с помощью DirectManipulation
В этом разделе представлен обзор модели потоков прямой манипуляции, того, как Direct Manipulation обрабатывает сообщения окна, и как изменяется состояние области просмотра при сопоставлении входных данных с движениями вывода.
прямой манипуляции использует два потока для координации асинхронных операций:
поток пользовательского интерфейса — поток, принадлежащий HWND, связанному с входными данными. Этот поток отвечает за инициализацию прямых манипуляций. Обработка ввода мыши и клавиатуры также выполняется в потоке пользовательского интерфейса.
делегировать поток — поток, созданный и принадлежащий прямому манипулированию. Обработка сенсорных входных данных выполняется в потоке делегата.
Входной поток
В типичной конфигурации, когда тестирование попаданий осуществляется в потоке пользовательского интерфейса, сообщения окна обрабатываются "Direct Manipulation" в следующем порядке:
Для видового экрана в покое:
- Ряд сообщений окна достигает потока делегата.
- WM_POINTERDOWN и DM_POINTERHITTEST сообщения отправляются делегатным потоком в поток Independent Hit Test (IHT).
- Если SetContact вызывается из потока IHT, сообщения могут отправляться в поток пользовательского интерфейса потоком делегата в зависимости от значения DIRECTMANIPULATION_HITTEST_TYPE при вызове RegisterHitTestTarget.
- Если SetContact не вызывается из потока IHT, сообщения всегда отправляются потоком делегирования в поток пользовательского интерфейса.
- Клиент может вызывать SetContact из потока пользовательского интерфейса, чтобы Direct Manipulation мог обнаружить манипуляцию.
- Если обнаружена манипуляция, система Direct Manipulation отправляет сообщение WM/_POINTERCAPTURECHANGED, чтобы уведомить клиента о том, что входные данные обрабатываются системой Direct Manipulation. Для состояния окна просмотра установлено значение RUNNING, и преобразование выходных данных будет обновлено.
- Если обнаружено взаимодействие, отличное от манипуляции, Прямая манипуляция отправляет оставшиеся сообщения в поток пользовательского интерфейса.
При движении видового экрана (со статусом ВЫПОЛНЕНИЯ или ИНЕРЦИИ) сообщение окна сначала поступает в поток делегата, где Direct Manipulation выполняет тесты касания для всех активных видовых экранов. Прямая манипуляция автоматически назначает контакт соответствующим окнам просмотра, определяемым тестом попаданий. Статус области просмотра выполняется, и преобразование выходных данных будет обновлено.
В некоторых случаях поток пользовательского интерфейса приложения может быть слишком медленным, чтобы реагировать на проверку попаданий. Можно использовать поток теста попаданий (RegisterHitTestTarget), чтобы разрешить клиенту перемещать WM/_POINTERDOWN и DM/_POINTERHITTEST сообщения в определенный поток, чтобы разрешить тестирование попаданий.
Замечания
Как правило, прямых манипуляций отправляет только сообщения WM/_POINTERDOWN и DM/_POINTERHITTEST в поток пользовательского интерфейса, удерживая последующие сообщения во время ожидания ответа от клиента. Если клиент вызывает SetContact, то единственными сообщениями, которые получает поток пользовательского интерфейса при обнаружении манипуляции, являются WM/_POINTERDOWN и DM/_POINTERHITTEST, и сообщение WM/_POINTERCAPTURECHANGED.
Клиент может не вызывать SetContact при обработке сообщений WM/_POINTERDOWN и DM/_POINTERHITTEST. В этом случае Direct Manipulation отправляет все сообщения в поток пользовательского интерфейса, не анализируя их, чтобы определить, есть ли манипуляция. Затем клиент может выбрать любую точку для вызова SetContact и чтобы Прямая Манипуляция начала обнаруживать манипуляции, и отправлять сообщения WM/_POINTERCAPTURECHANGED, когда одна из них обнаружена.
Windows 10 и более поздних версий: Вы можете решить, какие манипуляции необходимо обрабатывать, вызвав DeferContact перед вызовом SetContact в сообщении WM/_POINTERDOWN или DM/_POINTERHITTEST. DeferContact обеспечивает отправку всех последующих сообщений в поток пользовательского интерфейса в течение указанного периода времени.