编程指南:Windows Touch输入

Windows Touch输入

        本节包含有关处理Windows Touch输入的主题

说明
Windows Touch消息入门说明用于使Windows Touch输入在应用程序中正常工作的相关任务
检测盒跟踪多个触控点介绍如何识别和跟踪触控点


Windows Touch消息入门

        本节说明用于使Windows Touch输入在应用程序中正常工作的相关任务。
        以下步骤通常会在使用Windows Touch消息时执行:
        1、测试输入数字化器的功能。
        2、注册为接收Windows Touch消息。
        3、处理消息。
        用于Windows Touch的消息为WM_TOUCH。此消息指示与数字化器接触的各种状态。

测试输入数字化器的功能

        可使用GetSystemMetrics函数通过传入SM_DIGITIZER的nIndex值,查询输入数字化器的功能。GetSystemMetrics返回一个位字段,该字段指示设备是否准备就绪、设备是支持笔还是触摸、输入设备是集成的还是外置的以及设备是否支持多个输入(Windows Touch)。下表显示各个字段的位。
 位 87654321
 值堆栈就绪        多输入        保留        保留        外部笔        集成笔        外部触摸屏        集成触摸屏        
        若要测试通过特定功能的命令获得结果,可以使用按位&运算符和正在测试的特定位。例如,若要测试Windows Touch,应测试是否设置了第七顺序位(十六进制表示形式为0x40)。以下代码示例延时如何测试这些值。

#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 */
}
 
       下表列出了windows.h中定义的常量,这些常量用于测试输入数字化器的触摸功能。
名称说明
TABLET_CONFIG_NONE0x00000000输入数字化器不具有触摸功能。
NID_INTEGRATED_TOUCH0x00000001使用集成触摸数字化器进行输入。
NID_EXTERNAL_TOUCH0x00000002使用外部触摸数字化器进行输入。
NID_INTEGRATED_PEN0x00000004使用集成笔数字化器进行输入。
NID_EXTERNAL_PEN0x00000008使用外部笔数字化器进行输入。
NID_MULTI_INPUT0x00000040使用支持多个输入的输入数字化器进行输入。
NID_READY0x00000080输入数字化器已准备好进行输入。如果未设置此值,则可能意味着Tablet
服务已停止、数字化器不受支持或未安装数字化器驱动程序。
  
        检查NID_*值是一种很有用的方式,可用来检查用户计算机的功能以便配置应用程序进行触控输入、笔输入或非Tablet输入。例如,如果你具有动态用户界面(UI)并需要配置其中的部分内容,则可检查NID_INTEGRATED_TOUCH、NID_MULTITOUCH,并且可以获取用户首次运行应用程序时的最大触摸次数。
        注意:SM_GETSYSTEMMETRICS有一些内在限制。例如,不支持即插即用。因此,在使用此函数作为一种永久配置方式时,请谨慎使用。

注册为接收Windows Touch输入

        在接收Windows Touch输入之前,应用程序必须先注册为接收Windows Touch输入。通过注册应用程序窗口,应用程序指示它是与触摸兼容的。在应用程序注册其窗口之后,在该窗口中进行输入时,来自Windows Touch驱动程序的通知将转发到应用程序。当应用程序关闭时,它将注销其窗口以禁用通知。
        注意:WM_TOUCH消息当前是“贪婪的”。在一个窗口中收到第一条触控消息后,所有触控消息都将发送到该窗口,直到另一个窗口收到焦点。
        注意:默认情况下,你将接收WM_GESTURE消息而不是WM_TOUCH消息。如果调用RegisterTouchWindow,你将停止接收WM_GESTURE消息。
        以下代码演示应用程序如何注册为接收Win32应用程序中的Windows Touch消息。
RegisterTouchWindow( hWnd, 0 );

处理Windows Touch消息

        可通过多种方式在Windows 操作系统中处理来自应用程序的Windows Touch消息。如果你正在对GUI应用程序进行编程,则可在WndProc函数中添加代码以处理感兴趣的消息。如果你正在对Microsoft基础类(MFC)或托管应用程序进行编程,则可为感兴趣的消息添加处理程序。以下代码示例演示如何在基于Windows的应用程序中从WndProc处理触控消息。
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, probable out of memory */
        }
        if( bHandled )
        {
            // if you handled the message, close the touch input handle and return
            CloseTouchInputHandle( (HTOUCHINPUT)lParame );
            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;
    <pre name="code" class="cpp">    switch( message )
{ // pass touch message to the touch handler case WM_TOUCH: OnTouch( hWnd, wParam, lParam ); break; }}
         以下代码演示如何实现消息映射和消息处理程序。请注意,必须先在消息映射中声明消息,然后再实现消息的处理程序。例如,在MFC应用程序中,可以再对话框代码中进行此类声明。另请注意,对话框窗口的OnInitDialog函数必须包含对RegisterTouchWindow的调用,例如RegisterTouchWindow(m_hWnd, 0)。 
// Class implementations within a dialog
LESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam )
{
    // Insert handler code here to do something with the message or uncomment the following
    // 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 );
    ... ... ...
}

        触摸该窗口将指示来自弹出窗口的触摸。
        在开始接收触控消息后,可以将这些消息转换为触控输入结构,并可执行更多所需的操作。以下代码演示如何转换消息。
LRESULT OnTouchHandled( 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
            }
        }
        else
        {
            /* handle the error here, probably out of memory */
        }
        if( bHandled )
        {
            //  if you handled the message, close the touch input handle an return
            CloseTouchInputHandle( (HTOUCHINPUT)lParam );
            return 0;
        }
        else
        {
            // if you didn't handle the message, let DefWidowProc handle it
            return DefWindowProc( hWnd, WM_TOUCH, wParam, lParam );
        }
    }
}

检测和跟踪多个触控点
        以下步骤说明如何使用Windows Touch跟踪多个触控点。
        1、创建应用程序并启用Windows Touch。
        2、为WM_TOUCH添加处理程序并跟踪触控点。
        3、绘制触控点。

        在运行应用程序之后,它会在每个触控点处呈现一个圆圈。下图显示应用程序在运行时的可能外观。


创建应用程序并启用Windows Touch
        通过使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值