Prise en main avec les messages tactiles Windows
Cette section décrit les tâches associées à l’obtention d’une entrée Windows Touch pour fonctionner dans votre application.
Les étapes suivantes sont généralement effectuées lors de l’utilisation de messages Windows Touch :
- Testez les fonctionnalités du numériseur d’entrée.
- Inscrivez-vous pour recevoir des messages Windows Touch.
- Gérez les messages.
Le message utilisé pour Windows Touch est WM_TOUCH. Ce message indique les différents états de contact avec un numériseur.
Test des fonctionnalités du numériseur d’entrée
La fonction GetSystemMetrics peut être utilisée pour interroger les fonctionnalités du numériseur d’entrée en transmettant la valeur nIndex de SM_DIGITIZER. GetSystemMetrics retourne un champ bit qui indique si l’appareil est prêt, si l’appareil prend en charge le stylet ou le toucher, si le périphérique d’entrée est intégré ou externe et si l’appareil prend en charge plusieurs entrées (Windows Touch). Le tableau suivant montre les bits des différents champs.
bit | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
Valeur | Stack Ready | Multi-entrée | Réservé | Réservé | Stylet externe | Stylet intégré | Contact externe | Interaction tactile intégrée |
Pour tester le résultat de la commande pour une fonctionnalité particulière, vous pouvez utiliser l’opérateur au niveau & du bit et le bit particulier que vous testez. Par exemple, pour tester Windows Touch, vous devez tester que le bit de septième ordre est défini (0x40 en hexadécimal). L’exemple de code suivant montre comment ces valeurs peuvent être testées.
#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value & NID_MULTI_INPUT){
/* digitizer is multitouch */
MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}
Le tableau suivant répertorie les constantes définies dans windows.h pour tester les fonctionnalités tactiles du numériseur d’entrée.
Nom | Valeur | Description |
---|---|---|
TABLET_CONFIG_NONE | 0x00000000 | Le numériseur d’entrée n’a pas de fonctionnalités tactiles. |
NID_INTEGRATED_TOUCH | 0x00000001 | Un numériseur tactile intégré est utilisé pour l’entrée. |
NID_EXTERNAL_TOUCH | 0x00000002 | Un numériseur tactile externe est utilisé pour l’entrée. |
NID_INTEGRATED_PEN | 0x00000004 | Un numériseur de stylet intégré est utilisé pour l’entrée. |
NID_EXTERNAL_PEN | 0x00000008 | Un numériseur de stylet externe est utilisé pour l’entrée. |
NID_MULTI_INPUT | 0x00000040 | Un numériseur d’entrée avec prise en charge de plusieurs entrées est utilisé pour l’entrée. |
NID_READY | 0x00000080 | Le numériseur d’entrée est prêt pour l’entrée. Si cette valeur n’est pas définie, cela peut signifier que le service de tablette est arrêté, que le numériseur n’est pas pris en charge ou que les pilotes du numériseur n’ont pas été installés. |
La vérification des valeurs NID_* est un moyen utile de vérifier les fonctionnalités de l’ordinateur d’un utilisateur pour configurer votre application pour une entrée tactile, stylet ou non-tablette. Par exemple, si vous disposez d’une interface utilisateur dynamique et que vous souhaitez configurer automatiquement une partie de celle-ci, vous pouvez case activée pour NID_INTEGRATED_TOUCH, NID_MULTITOUCH et obtenir le nombre maximal de touches la première fois qu’un utilisateur exécute votre application.
Notes
Il existe certaines limitations inhérentes à SM_GETSYSTEMMETRICS. Par exemple, il n’y a pas de prise en charge du plug-and-play. Pour cette raison, soyez prudent lorsque vous utilisez cette fonction comme moyen de configuration permanente.
Inscription à la réception d’une entrée Windows Touch
Avant de recevoir une entrée Windows Touch, les applications doivent d’abord s’inscrire pour recevoir l’entrée Windows Touch. En inscrivant la fenêtre d’application, l’application indique qu’elle est compatible tactile. Une fois que l’application a inscrit sa fenêtre, les notifications du pilote Windows Touch sont transférées à l’application lorsque l’entrée est effectuée dans la fenêtre. Lorsque l’application s’arrête, elle annule l’inscription de sa fenêtre pour désactiver les notifications.
Notes
WM_TOUCH messages sont actuellement « gourmands ». Une fois le premier message tactile reçu dans une fenêtre, tous les messages tactiles sont envoyés à cette fenêtre jusqu’à ce qu’une autre fenêtre reçoive le focus.
Notes
Par défaut, vous recevez des messages WM_GESTURE plutôt que des messages WM_TOUCH . Si vous appelez RegisterTouchWindow, vous ne recevrez plus WM_GESTURE messages.
Le code suivant montre comment une application peut s’inscrire pour recevoir des messages Windows Touch dans une application Win32.
RegisterTouchWindow(hWnd, 0);
Gestion des messages tactiles Windows
Vous pouvez gérer les messages Windows Touch à partir d’applications dans les systèmes d’exploitation Windows de plusieurs façons. Si vous programmez une application GUI, vous ajoutez du code dans la WndProc
fonction pour gérer les messages d’intérêt. Si vous programmez une classe MFC (Microsoft Foundation Class) ou une application managée, vous ajoutez des gestionnaires pour les messages d’intérêt. L’exemple de code suivant montre comment les messages tactiles peuvent être gérés à partir de WndProc dans une application Windows.
LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
BOOL bHandled = FALSE;
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (UINT i=0; i < cInputs; i++){
TOUCHINPUT ti = pInputs[i];
//do something with each touch input entry
}
bHandled = TRUE;
}else{
/* handle the error here */
}
delete [] pInputs;
}else{
/* handle the error here, probably out of memory */
}
if (bHandled){
// if you handled the message, close the touch input handle and return
CloseTouchInputHandle((HTOUCHINPUT)lParam);
return 0;
}else{
// if you didn't handle the message, let DefWindowProc handle it
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
// pass touch messages to the touch handler
case WM_TOUCH:
OnTouch(hWnd, wParam, lParam);
break;
Le code suivant montre comment implémenter la carte de messages et un gestionnaire de messages. Notez que les messages doivent être déclarés dans la carte des messages, puis le gestionnaire du message doit être implémenté. Par exemple, dans une application MFC, cela peut être déclaré dans le code de boîte de dialogue. Notez également que la OnInitDialog
fonction de votre fenêtre de dialogue doit inclure un appel à RegisterTouchWindow tel que RegisterTouchWindow(m_hWnd, 0)
.
// Class implementations within a dialog
LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
//Insert handler code here to do something with the message or uncomment the following line to test
//MessageBox(L"touch!", L"touch!", MB_OK);
return 0;
}
// The message map
BEGIN_MESSAGE_MAP()
ON_WM_CREATE()
... ... ...
ON_MESSAGE(WM_TOUCH, OnTouch)
END_MESSAGE_MAP()
BOOL TestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
RegisterTouchWindow(m_hWnd, 0);
... ... ...
}
Le fait de toucher la fenêtre indique les touches à partir d’une fenêtre contextuelle.
Rubriques connexes