Compartilhar via


Introdução com mensagens do Windows Touch

Esta seção explica as tarefas associadas à entrada do Windows Touch para funcionar em seu aplicativo.

Normalmente, as etapas a seguir são executadas ao trabalhar com mensagens do Windows Touch:

  1. Teste os recursos do digitalizador de entrada.
  2. Registre-se para receber mensagens do Windows Touch.
  3. Manipule as mensagens.

A mensagem usada para o Windows Touch é WM_TOUCH. Esta mensagem indica os vários estados de contato com um digitalizador.

Testando os recursos do digitalizador de entrada

A função GetSystemMetrics pode ser usada para consultar os recursos do digitalizador de entrada passando o valor nIndex de SM_DIGITIZER. GetSystemMetrics retorna um campo de bits que indica se o dispositivo está pronto, se o dispositivo dá suporte a caneta ou toque, se o dispositivo de entrada é integrado ou externo e se o dispositivo dá suporte a várias entradas (Windows Touch). A tabela a seguir mostra os bits para os vários campos.

bit 8 7 6 5 4 3 2 1
Valor Pilha pronta Várias entradas Reservado Reservado Caneta externa Caneta integrada Toque Externo Toque Integrado

 

Para testar o resultado do comando para um recurso específico, você pode usar o operador bit a bit & e o bit específico que está testando. Por exemplo, para testar o Windows Touch, você testaria se o bit de sétima ordem está definido (0x40 no hex. O exemplo de código a seguir mostra como esses valores podem ser testados.

#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 */}

A tabela a seguir lista as constantes definidas no windows.h para testar os recursos de toque do digitalizador de entrada.

Nome Valor Descrição
TABLET_CONFIG_NONE 0x00000000 O digitalizador de entrada não tem recursos de toque.
NID_INTEGRATED_TOUCH 0x00000001 Um digitalizador de toque integrado é usado para entrada.
NID_EXTERNAL_TOUCH 0x00000002 Um digitalizador de toque externo é usado para entrada.
NID_INTEGRATED_PEN 0x00000004 Um digitalizador de caneta integrado é usado para entrada.
NID_EXTERNAL_PEN 0x00000008 Um digitalizador de caneta externa é usado para entrada.
NID_MULTI_INPUT 0x00000040 Um digitalizador de entrada com suporte para várias entradas é usado para entrada.
NID_READY 0x00000080 O digitalizador de entrada está pronto para entrada. Se esse valor não for definido, isso poderá significar que o serviço tablet foi interrompido, o digitalizador não tem suporte ou os drivers de digitalizador não foram instalados.

 

Verificar os valores NID_* é uma maneira útil de verificar os recursos do computador de um usuário para configurar seu aplicativo para entrada por toque, caneta ou não tablet. Por exemplo, se você tiver uma interface do usuário dinâmica (interface do usuário) e quiser configurar automaticamente parte dela, poderá marcar para NID_INTEGRATED_TOUCH, NID_MULTITOUCH e obter o número máximo de toques na primeira vez que um usuário executar seu aplicativo.

Observação

Há algumas limitações inerentes para SM_GETSYSTEMMETRICS. Por exemplo, não há suporte para plug-and-play. Por esse motivo, tenha cuidado ao usar essa função como um meio de configuração permanente.

 

Registrando-se para receber entrada do Windows Touch

Antes de receber a entrada do Windows Touch, os aplicativos devem primeiro se registrar para receber a entrada do Windows Touch. Ao registrar a janela do aplicativo, o aplicativo indica que ele é compatível com toque. Depois que o aplicativo registra sua janela, as notificações do driver do Windows Touch são encaminhadas para o aplicativo quando a entrada é feita na janela. Quando o aplicativo é desligado, ele cancela o registro de sua janela para desabilitar as notificações.

Observação

WM_TOUCH mensagens estão atualmente "gananciosas". Depois que a primeira mensagem de toque é recebida em uma janela, todas as mensagens de toque são enviadas para essa janela até que outra janela receba o foco.

 

Observação

Por padrão, você recebe mensagens WM_GESTURE em vez de WM_TOUCH mensagens. Se você chamar RegisterTouchWindow, deixará de receber WM_GESTURE mensagens.

 

O código a seguir demonstra como um aplicativo pode se registrar para receber mensagens do Windows Touch em um aplicativo Win32.

RegisterTouchWindow(hWnd, 0);

Manipulando mensagens de toque do Windows

Você pode lidar com as mensagens do Windows Touch de aplicativos em sistemas operacionais Windows de várias maneiras. Se você estiver programando um aplicativo gui, adicione código dentro da WndProc função para lidar com as mensagens de interesse. Se você estiver programando um MFC (Microsoft Foundation Class) ou um aplicativo gerenciado, adicione manipuladores para as mensagens de interesse. O exemplo de código a seguir mostra como as mensagens de toque podem ser manipuladas do WndProc em um aplicativo baseado no 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;

O código a seguir mostra como você pode implementar o mapa de mensagens e um manipulador de mensagens. Observe que as mensagens devem ser declaradas no mapa de mensagens e, em seguida, o manipulador da mensagem deve ser implementado. Por exemplo, em um aplicativo MFC, isso pode ser declarado no código da caixa de diálogo. Observe também que a OnInitDialog função da janela de diálogo teria que incluir uma chamada para RegisterTouchWindow , como 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);
     ... ... ...
  }  
  

Tocar na janela indicará toques de uma janela pop-up.

Entrada do Windows Touch