Windows Touch 消息入门-中文这个理
来源:互联网 发布:淘宝宝贝被排查下架 编辑:程序博客网 时间:2024/05/12 19:16
Windows Touch 消息入门
本节说明用于使 Windows Touch 输入在应用程序中正常工作的相关任务。
以下步骤通常会在使用 Windows Touch 消息时执行:
- 测试输入数字化器的功能。
- 注册为接收 Windows Touch 消息。
- 处理消息。
用于 Windows Touch 的消息为 WM_TOUCH。此消息指示与数字化器接触的各种状态。
测试输入数字化器的功能
可使用 GetSystemMetrics 函数通过传入 SM_DIGITIZER 的 nIndex 值,查询输入数字化器的功能。GetSystemMetrics 返回一个位字段,该字段指示设备是否准备就绪、设备是支持笔还是触摸、输入设备是集成的还是外置的以及设备是否支持多个输入 (Windows Touch)。下表显示各个字段的位。
若要测试通过特定功能的命令获得的结果,可以使用按位 & 运算符和正在测试的特定位。例如,若要测试 Windows Touch,应测试是否设置了第七顺序位(十六进制表示形式为 0x40)。以下代码示例演示如何测试这些值。
#include <windows.h>
// test for touchint 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 中定义的常量,这些常量用于测试输入数字化器的触摸功能。
检查 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 */ } 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); ... ... ... }
触摸该窗口将指示来自弹出窗口的触摸。
在开始接收触控消息后,可以将这些消息转换为触控输入结构,并可执行更多所需的操作。以下代码演示如何转换消息。
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 */ } 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); } }
- Windows Touch 消息入门-中文这个理
- Windows Touch的WM_GESTURE与WM_GESTURENOTIGY消息-中文整理
- Windows Touch宏-中文
- Windows消息----中文说明
- Windows消息----中文说明
- Windows Touch应用程序疑难解答-中文整理
- Windows Touch编程体系结构概述-中文整理
- Windows编程入门-Windows消息
- Windows编程入门-WM_PAINT消息
- Windows Touch的GESTURECONFIG,GESTUREINFO,GESTURENOTIFYSTRUCT结构体-中文整理
- Windows Touch编程选择使用适当方法-中文整理
- Windows编程入门-Windows消息机制
- Windows Touch
- windows消息中文注释和用法
- sencha touch发送消息
- Touch消息传到机制
- Windows Touch之关于Windows Touch
- Sencha Touch入门
- PHP闭包(Closure)初探
- 调度器的实现
- 简单说说android的线程封装
- 10812 - Beat the Spread!
- C++中的bitset
- Windows Touch 消息入门-中文这个理
- HTML5开发者心声:浏览器兼容性成最大问题
- spring的几个注意问题
- 检测和跟踪多个触控点-中文整理
- Git中文手册-基本用法
- 11498 - Division of Nlogonia
- Windows Touch编程体系结构概述-中文整理
- php click captcha 验证码类
- 25 个适合平面风格设计的新字体