Input di elaborazione con DirectManipulation
In questa sezione viene fornita una panoramica del modello di threading di manipolazione diretta , della modalità di elaborazione dei messaggi delle finestre tramite manipolazione diretta e del modo in cui lo stato di un riquadro di visualizzazione viene modificato come input viene mappato ai movimenti di output.
La manipolazione diretta usa due thread per coordinare le operazioni asincrone:
Thread dell'interfaccia utente : il thread proprietario dell'HWND associato all'input. Questo thread possiede l'inizializzazione della manipolazione diretta. L'elaborazione dell'input del mouse e della tastiera si verifica anche nel thread dell'interfaccia utente.
Thread delegato : il thread creato e di proprietà di Direct Manipulation. L'elaborazione dell'input tocco si verifica nel thread delegato.
Flusso di input
In una configurazione tipica in cui i test di hit test vengono eseguiti nel thread dell'interfaccia utente, i messaggi della finestra vengono elaborati da Manipolazione diretta nell'ordine seguente:
Per un viewport inattivo:
- Una serie di messaggi della finestra raggiunge il thread delegato.
- WM_POINTERDOWN e DM_POINTERHITTEST messaggi vengono inviati dal thread delegato al thread IHT (Independent Hit Test).
- Se SetContact viene chiamato dal thread IHT, i messaggi potrebbero essere inviati al thread dell'interfaccia utente dal thread delegato, a seconda del valore di DIRECTMANIPULATION_HITTEST_TYPE quando è stato chiamato RegisterHitTestTarget .
- Se SetContact non viene chiamato dal thread IHT, i messaggi vengono sempre inviati dal thread delegato al thread dell'interfaccia utente.
- Il client può chiamare SetContact dal thread dell'interfaccia utente per consentire a Direct Manipulation di rilevare una manipolazione.
- Se viene rilevata una manipolazione, La manipolazione diretta invia un messaggio WM/_POINTERCAPTURECHANGED per notificare al client che l'input viene gestito da Direct Manipulation. Lo stato del viewport è impostato su RUNNING e la trasformazione di output verrà aggiornata.
- Se viene rilevata un'interazione diversa da una manipolazione, La manipolazione diretta invia messaggi rimanenti al thread dell'interfaccia utente.
Per un viewport in movimento (con stato RUNNING o INERTIA), il messaggio della finestra raggiunge prima il thread delegato, in cui La manipolazione diretta ha colpito i test su tutti i viewport in esecuzione. La manipolazione diretta assegna automaticamente il contatto ai viewport appropriati identificati dai test di hit test. Lo stato del viewport è RUNNING e la trasformazione di output verrà aggiornata.
In alcuni casi, un thread dell'interfaccia utente dell'applicazione potrebbe essere troppo lento per rispondere ai test di hit test. Un thread di hit test può essere usato (RegisterHitTestTarget) per consentire al client di spostare messaggi WM/_POINTERDOWN e DM/_POINTERHITTEST a un thread specifico per consentire il hit test.
Commenti
In genere, La manipolazione diretta invia solo messaggi WM/_POINTERDOWN e DM/_POINTERHITTEST al thread dell'interfaccia utente, mantenendo i messaggi successivi in attesa di una risposta dal client. Se il client chiama SetContact, l'unico messaggio ricevuto dal thread dell'interfaccia utente quando viene rilevata una manipolazione è WM/_POINTERDOWN e DM/_POINTERHITTEST e il messaggio WM/_POINTERCAPTURECHANGED.
Il client potrebbe non chiamare SetContact durante l'elaborazione di messaggi WM/_POINTERDOWN e DM/_POINTERHITTEST . In questo caso, La manipolazione diretta invia tutti i messaggi al thread dell'interfaccia utente senza analizzare i messaggi per verificare se esiste una manipolazione. Il client può quindi scegliere qualsiasi punto per chiamare SetContact e avere l'avvio della manipolazione diretta per rilevare le manipolazioni e inviare messaggi di messaggio WM/_POINTERCAPTURECHANGED quando viene rilevato.
Windows 10 e versioni successive: è possibile decidere quali manipolazioni si desidera gestire chiamando DeferContact prima di chiamare SetContact in un messaggio WM/_POINTERDOWN o DM/_POINTERHITTEST. DeferContact garantisce che tutti i messaggi successivi vengano inviati al thread dell'interfaccia utente per il periodo di tempo specificato.