Procesamiento de la entrada con DirectManipulation
En esta sección se proporciona información general sobre el modelo de subprocesos de manipulación directa , cómo la manipulación directa procesa los mensajes de ventana y cómo cambia el estado de una ventanilla a medida que la entrada se asigna a los movimientos de salida.
La manipulación directa usa dos subprocesos para coordinar las operaciones asincrónicas:
Subproceso de interfaz de usuario: subproceso que posee el HWND asociado a la entrada. Este subproceso posee la inicialización de manipulación directa. El procesamiento de entrada del mouse y del teclado también se produce en el subproceso de interfaz de usuario.
Delegar subproceso: el subproceso creado y propiedad de La manipulación directa. El procesamiento de entrada táctil se produce en el subproceso delegado.
Flujo de entrada
En una configuración típica en la que las pruebas de posicionamiento se realizan en el subproceso de interfaz de usuario, la manipulación directa procesa los mensajes de ventana en el orden siguiente:
Para una ventanilla en reposo:
- Una serie de mensajes de ventana llegan al subproceso delegado.
- WM_POINTERDOWN y los mensajes de DM_POINTERHITTEST los envía el subproceso delegado al subproceso de prueba de posicionamiento independiente (IHT).
- Si se llama a SetContact desde el subproceso de IHT, es posible que el subproceso delegado envíe mensajes al subproceso de interfaz de usuario, en función del valor de DIRECTMANIPULATION_HITTEST_TYPE cuando se llamó a RegisterHitTestTarget .
- Si no se llama a SetContact desde el subproceso IHT, el subproceso delegado siempre envía mensajes al subproceso de la interfaz de usuario.
- El cliente puede llamar a SetContact desde el subproceso de interfaz de usuario para permitir que La manipulación directa detecte una manipulación.
- Si se detecta una manipulación, La manipulación directa envía un mensaje WM/_POINTERCAPTURECHANGED para notificar al cliente que la entrada se controla mediante manipulación directa. El estado de la ventanilla se establece en RUNNING y se actualizará la transformación de salida.
- Si se detecta una interacción distinta de una manipulación, La manipulación directa envía los mensajes restantes al subproceso de la interfaz de usuario.
Para una ventanilla en movimiento (con el estado RUNNING o INERTIA), el mensaje de ventana llega primero al subproceso delegado, donde Direct Manipulation alcanza las pruebas de posicionamiento en todas las ventanillas en ejecución. La manipulación directa asigna automáticamente el contacto a las ventanillas adecuadas identificadas por las pruebas de posicionamiento. El estado de la ventanilla es RUNNING y se actualizará la transformación de salida.
En algunos casos, un subproceso de interfaz de usuario de la aplicación puede ser demasiado lento para responder a las pruebas de posicionamiento. Se puede usar un subproceso de prueba de posicionamiento (RegisterHitTestTarget) para permitir que el cliente mueva mensajes WM/_POINTERDOWN y DM/_POINTERHITTEST a un subproceso específico para permitir pruebas de posicionamiento.
Comentarios
Normalmente, la manipulación directa envía solo mensajes WM/_POINTERDOWN y DM/_POINTERHITTEST al subproceso de la interfaz de usuario, reteniendo mensajes posteriores mientras espera una respuesta del cliente. Si el cliente llama a SetContact, los únicos mensajes que recibe el subproceso de interfaz de usuario cuando se detecta una manipulación son WM/_POINTERDOWN y DM/_POINTERHITTEST y WM/_POINTERCAPTURECHANGED mensaje.
Es posible que el cliente no llame a SetContact al procesar mensajes WM/_POINTERDOWN y DM/_POINTERHITTEST . En este caso, La manipulación directa envía todos los mensajes al subproceso de la interfaz de usuario sin analizar los mensajes para ver si hay una manipulación. A continuación, el cliente puede elegir cualquier punto para llamar a SetContact y hacer que la manipulación directa empiece a detectar manipulaciones y envíe mensajes wm/_POINTERCAPTURECHANGED mensajes cuando se detecte uno.
Windows 10 y versiones posteriores: puede decidir qué manipulaciones desea controlar llamando a DeferContact antes de llamar a SetContact en un mensaje WM/_POINTERDOWN o DM/_POINTERHITTEST. DeferContact garantiza que todos los mensajes posteriores se envían al subproceso de la interfaz de usuario durante el período de tiempo especificado.