使用 Windows 触控消息入门
本部分介绍与使 Windows Touch 输入在应用程序中正常运行相关的任务。
处理 Windows Touch 消息时,通常会执行以下步骤:
- 测试输入数字化器的功能。
- 注册以接收 Windows Touch 消息。
- 处理消息。
用于 Windows Touch 的消息WM_TOUCH。 此消息指示与数字化器接触的各种状态。
测试输入数字化器的功能
GetSystemMetrics 函数可用于通过传入 SM_DIGITIZER 的 nIndex 值来查询输入数字化器的功能。 GetSystemMetrics 返回一个位字段,指示设备是否已准备就绪,设备是否支持笔或触摸,输入设备是集成还是外部,以及设备是否支持多个输入 (Windows Touch) 。 下表显示了各个字段的位。
bit | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
值 | 堆栈就绪 | 多输入 | 预留 | 预留 | 外部笔 | 集成触控笔 | 外部触摸 | 集成触控 |
若要测试特定功能命令的结果,可以使用按 & 位运算符和要测试的特定位。 例如,若要测试 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_NONE | 0x00000000 | 输入数字化器没有触摸功能。 |
NID_INTEGRATED_TOUCH | 0x00000001 | 集成触摸数字化器用于输入。 |
NID_EXTERNAL_TOUCH | 0x00000002 | 外部触摸数字化器用于输入。 |
NID_INTEGRATED_PEN | 0x00000004 | 集成笔数字化器用于输入。 |
NID_EXTERNAL_PEN | 0x00000008 | 外部笔数字化器用于输入。 |
NID_MULTI_INPUT | 0x00000040 | 支持多个输入的输入数字化器用于输入。 |
NID_READY | 0x00000080 | 输入数字化器已准备好输入。 如果未设置此值,则可能意味着平板电脑服务已停止、不支持数字化器或未安装数字化器驱动程序。 |
检查NID_* 值是检查用户计算机为应用程序配置触摸、笔或非平板电脑输入的功能的有用方法。 例如,如果你有一个动态用户界面 (UI) ,并且想要自动配置其中某些用户界面,则可以检查NID_INTEGRATED_TOUCH、NID_MULTITOUCH,并且可以在用户首次运行应用程序时获得最大触摸次数。
注意
SM_GETSYSTEMMETRICS存在一些固有限制。 例如,不支持即插即用。 出于此原因,使用此函数作为永久配置的方法时,请小心谨慎。
注册以接收 Windows 触控输入
在接收 Windows Touch 输入之前,应用程序必须先注册以接收 Windows Touch 输入。 通过注册应用程序窗口,应用程序指示它与触摸兼容。 应用程序注册其窗口后,在窗口上进行输入时,来自 Windows Touch 驱动程序的通知将转发给应用程序。 当应用程序关闭时,它会注销其窗口以禁用通知。
注意
WM_TOUCH 消息目前是“贪婪的”。在窗口上收到第一条触摸消息后,所有触摸消息都会发送到该窗口,直到另一个窗口收到焦点。
注意
默认情况下,你会收到 WM_GESTURE 消息,而不是 WM_TOUCH 消息。 如果调用 RegisterTouchWindow,将停止接收 WM_GESTURE 消息。
以下代码演示了应用程序如何注册以在 Win32 应用程序中接收 Windows Touch 消息。
RegisterTouchWindow(hWnd, 0);
处理 Windows 触控消息
可以通过多种方式处理来自 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 */
}
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;
以下代码演示如何实现消息映射和消息处理程序。 请注意,必须在消息映射中声明消息,然后应实现消息的处理程序。 例如,在 MFC 应用程序中,可以在对话代码中声明这一点。 另请注意,对话窗口的 OnInitDialog
函数必须包含对 RegisterTouchWindow 的调用,例如 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);
... ... ...
}
触摸窗口将指示从弹出窗口进行触摸。
相关主题