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


Обработка входных данных с помощью DirectManipulation

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

Direct Manipulation использует два потока для координации асинхронных операций:

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

Поток делегата — поток, созданный и принадлежащий прямой манипуляции. Обработка сенсорного ввода выполняется в потоке делегата.

Поток ввода

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

схема, показывающая порядок обработки сообщений.

Для неактивного окна просмотра:

  1. Ряд оконных сообщений достигает потока делегата.
  2. WM_POINTERDOWN и DM_POINTERHITTEST сообщения отправляются потоком делегата в поток Независимого теста попадания (IHT).
  3. Если метод SetContact вызывается из потока IHT, сообщения могут отправляться в поток пользовательского интерфейса потоком делегата в зависимости от значения DIRECTMANIPULATION_HITTEST_TYPE при вызове RegisterHitTestTarget .
  4. Если метод SetContact не вызывается из потока IHT, сообщения всегда отправляются потоком делегата в поток пользовательского интерфейса.
  5. Клиент может вызвать SetContact из потока пользовательского интерфейса, чтобы позволить Direct Manipulation обнаружить манипуляцию.
  6. При обнаружении манипуляции прямая манипуляция отправляет wm/_POINTERCAPTURECHANGED сообщение, уведомляющее клиента о том, что входные данные обрабатываются прямой манипуляцией. Состояние окна просмотра имеет значение ВЫПОЛНЯЕТся , и преобразование выходных данных будет обновлено.
  7. При обнаружении взаимодействия, отличного от манипуляции, direct Manipulation отправляет оставшиеся сообщения в поток пользовательского интерфейса.

Для перемещаемого окна просмотра (с состоянием RUNNING или INERTIA) сообщение окна сначала достигает потока делегата, где прямые манипуляции проверяют все запущенные окна просмотра. Прямая манипуляция автоматически назначает контакт соответствующим окнам просмотра, определенным при проверке попадания. Состояние окна просмотра — ВЫПОЛНЯЕТся, и преобразование выходных данных будет обновлено.

В некоторых случаях поток пользовательского интерфейса приложения может быть слишком медленным для реагирования на тестирование попадания. Можно использовать поток проверки попадания (RegisterHitTestTarget), чтобы клиент мог перемещать сообщения WM/_POINTERDOWN и DM/_POINTERHITTEST в определенный поток, чтобы обеспечить проверку попадания.

Комментарии

Как правило, прямая манипуляция отправляет в поток пользовательского интерфейса только wm/_POINTERDOWN и DM/_POINTERHITTEST сообщения, удерживая последующие сообщения в ожидании ответа от клиента. Если клиент вызывает SetContact, поток пользовательского интерфейса получает при обнаружении манипуляции только WM/_POINTERDOWN и DM/_POINTERHITTEST, а также WM/_POINTERCAPTURECHANGED.

Клиент может не вызывать SetContact при обработке сообщений WM/_POINTERDOWN и DM/_POINTERHITTEST . В этом случае прямая манипуляция отправляет все сообщения в поток пользовательского интерфейса без анализа сообщений, чтобы узнать, есть ли манипуляция. Затем клиент может выбрать любую точку для вызова SetContact и начать обнаружение манипуляций с помощью direct manipulation и отправлять сообщения WM/_POINTERCAPTURECHANGED при обнаружении.

Windows 10 и более поздних версий. Вы можете решить, какие манипуляции нужно обрабатывать, вызвав DeferContact перед вызовом SetContact для сообщения WM/_POINTERDOWN или DM/_POINTERHITTEST. DeferContact гарантирует, что все последующие сообщения отправляются в поток пользовательского интерфейса в течение указанного периода времени.