windows7触屏操作API

2023-05-16

每当用户触摸触敏式 Windows 7 设备时,Windows 7 多点触控平台都会向您的应用程序发送手势消息 WM_GESTURE。这是现成的免费行为,如果您希望停止接收此类消息,则需要选择退出。
手势被视为单指或双指触控输入,可以转换为用户执行的某种预定义操作(手势)。一旦检测到手势(操作系统为您进行所有检测),操作系统就会向应用程序发送手势消息。此消息包含解码和进行操作所需的全部信息。Windows 7 支持下列手势:
  • 缩放
  • 单指和双指平移
  • 旋转
  • 双指点击
  • 按下并点击
处理 WM_Gesture 消息  要使用手势,必须处理发送到应用程序的 WM_GESTURE 消息。如果您是 Win32 程序员,可以在应用程序的 WndProc 函数中检查 WM_GESTURE 消息。
WM_GESTURE 是用于所有手势的通用消息。因此,要确定需要处理的手势,您首先需要对手势消息进行解码。有关手势的信息可在 lParam 参数中找到,您需要使用一个特殊函数 GetGestureInfo 来解码手势消息,如下面的代码片段中所示。
[cpp] view plain copy print ?
  1. GESTUREINFO gi;  
  2. ZeroMemory(&gi, sizeof(GESTUREINFO));  
  3. gi.cbSize = sizeof(gi);  
  4. BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi);  
GESTUREINFO gi;
ZeroMemory(&gi, sizeof(GESTUREINFO));
gi.cbSize = sizeof(gi);
BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi);

获取 GESTUREINFO 结构后,可以检查 dwID 以确定执行了哪个手势。GESTUREINFO 结构包含几个其他重要成员:
  • cbSize - 结构大小(以字节为单位)
  • ptsLocation - 一个 POINTS 结构,其中包含与手势相关的坐标。这些坐标始终都相对于屏幕的原点
  • dwFlags - 手势的状态,例如开始、延时和结束
  • ullArguments - 一个 64 位无符号整数,其中包含手势的参数,组合为八字节。这是额外信息,对于每个手势类型都是唯一的

继续操作并编写用于处理所有手势的完整 switch-case 方法

 

[cpp] view plain copy print ?
  1. void CMTTestDlg::DecodeGesture(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     GESTUREINFO gi;   
  4.     ZeroMemory(&gi, sizeof(GESTUREINFO));  
  5.     GetGestureInfo((HGESTUREINFO)lParam, &gi);  
  6.     switch (gi.dwID){  
  7.         case GID_ZOOM:  
  8.             // Code for zooming goes here   
  9.             break;  
  10.         case GID_PAN:  
  11.             break;  
  12.         case GID_ROTATE:  
  13.             break;  
  14.         case GID_TWOFINGERTAP:  
  15.             break;  
  16.         case GID_PRESSANDTAP:  
  17.             break;  
  18.         default:  
  19.             // You have encountered an unknown gesture   
  20.             break;  
  21.     CloseGestureInfoHandle((HGESTUREINFO)lParam);  
  22. }  
void CMTTestDlg::DecodeGesture(WPARAM wParam, LPARAM lParam)
{
    GESTUREINFO gi; 
    ZeroMemory(&gi, sizeof(GESTUREINFO));
    GetGestureInfo((HGESTUREINFO)lParam, &gi);
    switch (gi.dwID){
        case GID_ZOOM:
            // Code for zooming goes here
            break;
        case GID_PAN:
            break;
        case GID_ROTATE:
            break;
        case GID_TWOFINGERTAP:
            break;
        case GID_PRESSANDTAP:
            break;
        default:
            // You have encountered an unknown gesture
            break;
    CloseGestureInfoHandle((HGESTUREINFO)lParam);
}

 

 

请注意,在函数的末尾,我们调用了   CloseGestureInfoHandle  函数,用于关闭与手势信息处理程序相关联的资源。如果处理 WM_GESTURE 消息,则您要确保使用此函数来关闭句柄。不这么做可能会导致内存泄漏。
处理手势消息具有一个固定流程,包括配置、解码手势消息以及根据应用程序的需要处理特定手势。正如您在以上代码中看到的那样,执行这个流程并不很难。

 

现在,让我们来详细了解缩放手势,通过这种手势,您也可以大致了解所有其他手势的工作原理。
使用缩放手势缩放对象
缩放手势通常被用户视为两个接触点之间的“挤压”运动,您可以将手指相互靠近以缩小内容显示,或者将手指分开以放大内容显示。使用缩放手势,您可以缩放对象的大小。 图   说明了缩放手势的使用方式

 

现在,我们将了解需要在 GID_ZOOM switch 中实现什么代码才能达到所需的缩放效果。
手势信息结构包括 dwFlags 成员,该成员用于确定手势的状态,而且可以包括以下任何值:
  • GF_BEGIN - 指示手势即将开始,在第一个 WM_Gesture 消息中收到
  • GF_INERTIA - 指示手势已经触发了延时
  • GF_END - 指示手势已经完成
  • switch 的默认值 - 指示手势消息的剩余部分,通常称为变化量
我们将使用 GF_BEGIN 标志将接触点的初始开始坐标保存在变量中,并将其作为以下步骤的引用。我们将 ptsLocation  保存在   _ptFirst  变量中。对于缩放手势, ptsLocation  表示缩放的中心。
收到的以下缩放消息由 default case 进行处理。我们将坐标保存在   _ptSecond  变量中。接下来,我们将计算缩放中心点和缩放比例。最后,我们还将更新矩形(我们的图形对象)以反映缩放中心点和缩放比例。 显示了这些参数。

GID_ZOOM Switch:

[cpp] view plain copy print ?
  1. case GID_ZOOM:  
  2. switch(gi.dwFlags)  
  3. {  
  4. case GF_BEGIN:  
  5.     _dwArguments = LODWORD(gi.ullArguments);  
  6.     _ptFirst.x = gi.ptsLocation.x;  
  7.     _ptFirst.y = gi.ptsLocation.y;  
  8.     ScreenToClient(hWnd,&_ptFirst);  
  9.     break;  
  10. default:  
  11.     // We read here the second point of the gesture. This is middle point between fingers.    
  12.     _ptSecond.x = gi.ptsLocation.x;  
  13.     _ptSecond.y = gi.ptsLocation.y;  
  14.     ScreenToClient(hWnd,&_ptSecond);  
  15.     // We have to calculate zoom center point    
  16.     ptZoomCenter.x = (_ptFirst.x + _ptSecond.x)/2;  
  17.     ptZoomCenter.y = (_ptFirst.y + _ptSecond.y)/2;             
  18.       
  19.     // The zoom factor is the ratio between the new and the old distance.    
  20.     k = (double)(LODWORD(gi.ullArguments))/(double)(_dwArguments);  
  21.     // Now we process zooming in/out of the object   
  22.     ProcessZoom(k,ptZoomCenter.x,ptZoomCenter.y);  
  23.     InvalidateRect(hWnd,NULL,TRUE);  
  24.   
  25.     // Now we have to store new information as a starting information for the next step   
  26.     _ptFirst = _ptSecond;  
  27.     _dwArguments = LODWORD(gi.ullArguments);  
  28.     break;  
  29. }  
  30. break;  
case GID_ZOOM:
switch(gi.dwFlags)
{
case GF_BEGIN:
    _dwArguments = LODWORD(gi.ullArguments);
    _ptFirst.x = gi.ptsLocation.x;
    _ptFirst.y = gi.ptsLocation.y;
    ScreenToClient(hWnd,&_ptFirst);
    break;
default:
    // We read here the second point of the gesture. This is middle point between fingers. 
    _ptSecond.x = gi.ptsLocation.x;
    _ptSecond.y = gi.ptsLocation.y;
    ScreenToClient(hWnd,&_ptSecond);
    // We have to calculate zoom center point 
    ptZoomCenter.x = (_ptFirst.x + _ptSecond.x)/2;
    ptZoomCenter.y = (_ptFirst.y + _ptSecond.y)/2;           
    
    // The zoom factor is the ratio between the new and the old distance. 
    k = (double)(LODWORD(gi.ullArguments))/(double)(_dwArguments);
    // Now we process zooming in/out of the object
    ProcessZoom(k,ptZoomCenter.x,ptZoomCenter.y);
    InvalidateRect(hWnd,NULL,TRUE);

    // Now we have to store new information as a starting information for the next step
    _ptFirst = _ptSecond;
    _dwArguments = LODWORD(gi.ullArguments);
    break;
}
break;

在默认的 case 处理程序中,我们保存手势的位置,从两组点(表示当前接触点和前一个接触点)计算缩放中心位置,并将其存储在   ptZoomCenter  中。我们还通过计算两个点之间的比例来计算出缩放系数。调用 ProcessZoom  帮助函数可以更新新的坐标,以反映缩放系数和中心点。
处理其他 Windows 7 默认手势与以上所述的特定缩放手势处理非常相似。所有手势都遵循相同的流程,只是在每个使用案例场景中,每个手势的内部逻辑实现有所不同。

转载于:https://www.cnblogs.com/Dennis-mi/p/3414703.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows7触屏操作API 的相关文章

  • 415 不支持的媒体类型; Angular2 到 API

    我是 Angular 2 的新手 我面临着一个无法找到解决方案的问题 当我尝试从 Angular 2 发布到 API 时 我得到 415 不支持的媒体类型 角度2代码 onSubmit value any console log value
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • 彭博开放 API

    彭博开放 API最近宣布 http www computerworlduk com news it business 3334375 bloomberg market data api made public 这只是彭博软件开发工具包 ht
  • Windows 睡眠功能极慢

    我正在通过 Windows h 使用 Sleep 命令制作一个程序 并且在 Windows 10 而不是 Windows 7 上运行我的程序时遇到了令人沮丧的差异 我将我的程序简化为下面的程序 它与我的更复杂的程序表现出相同的行为 在 Wi
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 在Wordpress中通过API创建新用户时如何发送电子邮件密码?

    可以使用以下行通过 API 创建新用户 user id wp insert user user data 我想知道如何向新创建的用户发送包含其密码的电子邮件 Wordpress API 中是否有任何函数可以处理这项工作 还是我应该自己创建并
  • 从 iOS 应用程序内的 Junos Pulse 获取用户凭据

    我正在通过 Junos Pulse 在 iPad 中建立 VPN 连接 以进入我组织的 Intranet 谁能告诉我是否有任何 iOS api 或 SDK 可用于获取在 iOS 应用程序内的 Junos pulse 中输入的用户凭据 Jun
  • Web 应用程序使用 API 来完成一切?

    我即将开始为我的公司规划一个内部项目管理工具 API 一直让我疑惑 首先创建 API 并使用这些 API 调用构建实际站点而不是实施两次 是否会被视为不好的做法 效率太低 让我知道你的想法 我完全同意开发 API 将为您提供解耦的架构 并且
  • 是否有 .NET 库或 API 可以与 IIS 配置数据库交互/编辑它?

    或者我是否坚持使用自己的 XML 切割 功能 我想创建一个小型任务托盘应用程序 以便我可以快速将虚拟目录重新指向硬盘上的几个文件夹之一 一点背景 我的开发机器上的代码库有 3 个不同的 svn 分支 Current Production B
  • 证书问题 - Windows 7 升级后导入密钥“对象已存在”时出错

    我有大约 60 个 pfx 文件 用于项目的所有主要程序集 它们是独特的文件 但我对所有文件使用相同的密码 从 Windows Vista 升级到 Windows 7 后 当我在 Visual Studio 2008 中单击 生成 时 会出
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 如何获取Postgres当前的可用磁盘空间?

    在开始在数据库中进行某些工作之前 我需要确保至少有 1Gb 的可用磁盘空间 我正在寻找这样的东西 select pg get free disk space 是否可以 我在文档中没有找到任何相关内容 PG 9 3 操作系统 Linux Wi
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 谷歌地图的地址建议

    有人知道是否有任何方法可以重现 ajax 建议框 例如http maps google com http maps google com 我的网页中有使用 google 地图 api 的吗 例如 如果有人写下 15 Avenue 的建议列表
  • 如何使用 C# API 移动 TFS 文件?

    我一直在谷歌上搜索如何使用 TFS API 通过 C 移动文件 我们的想法是有一个文件夹 开发人员可以在其中放置数据库升级脚本 构建过程会在该文件夹中创建一个构建脚本 并将该文件夹上的所有文件移动到具有我们刚刚创建的数据库构建版本的新文件夹
  • flutter中api调用哪种方式最好

    我是颤振开发的新手 最近听说了Dio和Http包用于api调用 这是 api 调用的最佳选择 如果有人有更好的api服务方式 CreateAccountRepository internal static final CreateAccou
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 从 Delphi 访问 TRAKT API - 承载身份验证问题

    使用 TOauth2Authenticator TRESTClient TRESTRequest TRESTResponseDataSet TRESTResponse TFDmemtable 和 TDataSource 我成功连接到 Tra
  • 请放心,如何在 POST 请求后从响应正文中提取生成的令牌并将其设置到标头

    执行任何请求 我需要执行身份验证POST请求正文 username somename password somepass 标头Content Type application json这给了我一个带有生成令牌的响应 我需要将其粘贴为第二个标
  • 具有 .net core 后端和 .net 身份的 React SPA 应用程序

    我基本上有与这里详细说明的相同的问题 使用 asp Core 2 0 和 React 进行登录重定向 https stackoverflow com questions 48337368 但那个帖子从未得到答复 我已经搜索了很多 几乎我的问

随机推荐

  • JAVA从入门到精通(18)-- Servlet

    一 Servlet定义 1 现有JSP还是先有Servlet xff1f 先有的Servlet xff0c 因为JSP的前身就是Servlet 2 定义 xff1a Servlet是在服务器上运行的小程序 一个Servlet就是一个Java
  • pixhawk自学笔记之uorb学习总结

    注 xff1a 这是看过好多文章总结出来的 xff0c 转载了较多人的博客 xff0c 希望有知道原出处的人把地址留下 xff0c 我贴上来 在此谢谢各位前辈的总结 xff08 我会在后续笔记中贴出在我自己的程序中对于uorb的使用 xff
  • pixhawk自学笔记之px4程序启动顺序

    在了解px4启动之前我们需要了解一下bootloader Bootloader是在操作系统内核运行之前运行 xff0c 可以初始化硬件设备 xff0c 建立内存空间映射图等 xff0c 整个系统的加载启动任务就是完全由Bootloader来
  • PID概述以及在无人机中的应用

    PID控制是将误差信号的比例P xff0c 积分I xff0c 微分D通过线性组合构成控制量 xff0c 称之为PID控制 但是在很多情况下 xff0c 往往不一定需要三个单元 xff0c 但是比例单元是必不可少的 PID控制器难点在于参数
  • PID连续控制算法的表达式以及C语言实现

    1 数字 xff08 离散 xff09 PID控制算法的表达式 xff1a 将PID调节器离散化 xff0c 用差分方程来代替连续系统的微分方程 xff0c 分为位置式和增量式两类 重点理解概念如下 xff1a a xff09 基本偏差e
  • 简单常用滤波算法C语言实现

    1 限幅滤波算法 xff08 程序判断滤波算法 xff09 方法解析 xff1a 根据经验判断 xff0c 确定两次采样允许的最大偏差值 xff08 设定为A xff09 xff0c 每次检测到新值时判断 xff1a 如果本次值与上次值之差
  • Nuttx的源码构建和编译

    下载源码 sudo mkdir Nuttx cd Nuttx Nuttx xff1a git clone https bitbucket org nuttx nuttx gitapps xff1a git clone https bitbu
  • ZMQ简介

    ZMQ xff08 MQ ZeroMQ 0MQ xff09 看起来像是一套嵌入式的网络链接库 xff0c 是网络通信中新的一层 xff0c 介于应用层和传输层之间 xff08 按照TCP IP划分 xff09 xff0c 其是一个可伸缩层
  • ubunut安装stlink

    在ubuntu上面的stlink驱动的安装 依赖包的安装 sudo apt get install libusb 1 0sudo apt get install cmakesudo apt get install libgtk 3 dev
  • Nuttx程序测试

    前面两篇文章我们讲述了如何编译nuttx和ubuntu下stlink的安装 现在我们继续往下测试程序 硬件环境 stm32f407discovery软件环境 ubuntu14 04 43 vim 我们首先进入到nuttx tools目录下执
  • 两种四轴PID讲解

    参考资料 xff1a 爱无人机论坛 单级PID xff1a PID算法属于一种线性控制器 xff0c 这种控制器被广泛应用于四轴上 要控制四轴 xff0c 显而易见的是控制它的角度 xff0c 那么最简单 xff0c 同时也是最容易想到的一
  • 麒麟系统开机自启的实现方式

    方法 xff1a 利用Linux的 desktop文件实现开机启动 xff0c desktop文件位于在 etc xdg autostart目录下 举例 在 etc xdg autostart 目录下建立一个 test desktop文件
  • ifconfig与 ip addr命令详细

    文章目录 前言一 如何查看机器的IP地址二 网卡信息详解1 网卡名称2 网络设备状态标识3 IP地址4 MAC地址 三 ifconfig与 ip addr区别 前言 本文记录在linux系统下如何查看ip信息 网卡状态等信息以及简要说明if
  • Linux网卡ifcfg网卡配置项详解

    前言 由于在工作中涉及到服务器网卡的适配 xff0c 算是linux新手 xff0c 本次记录下linux网卡ifcfg exx配置项含义说明 xff0c 以下是某款终端下centos 7 5系统自动生成的网卡配置内容 xff1a span
  • Determining IP information for eth问题解决

    前言 在Linux网卡ifcfg网卡配置项详解文章中提到一个BOOTPROTO 61 配置项 它的意思是指网卡启动时获取ip的方式 xff0c 可以是dhcp或者静态ip 方式 xff0c 如果设置为none说明是不指定ip设置方式 一 问
  • 回首2013,展望2014

    此刻值此2013年末 xff0c 明天便是元旦 近日浏览CSDN论坛时 xff0c 发现有许多的坛友都在写2013年度总结 xff0c 博客作为个人的名片 xff0c 也决定开始尝试写博客 xff0c 我的第一篇博客就是关于2013年度总结
  • 关于vector大小(size)和容量(capacity)总结

    操作大小的函数 在Vector容器中有以下几个关于大小的函数 方法效果size 返回容器的大小empty 判断容器是否为空max size 返回容器最大的可以存储的元素capacity 返回容器当前能够容纳的元素数量 例子一 xff1a 该
  • inet_addr 和inet_ntoa函数作用

    我们使用socket进行通信的时候 xff0c 我们需要指定三个元素 xff1a 通信域 xff08 地址族 xff09 IP地址 端口号 xff0c 这三个元素由SOCKADDR IN结构体定义 xff0c 为了简化编程一般将IP地址设置
  • 使用C语言完成单片机的底层配置操作

    整体概貌 单片机型号 xff1a C8051F020 技术等级 xff1a 不懂底层编程的菜鸟 写作目的 xff1a 加深对底层的了解 xff0c 方便下一步对FPGA底层配置的实现 编写内容 xff1a 1 定时器的定时 2 串口波特率的
  • windows7触屏操作API

    每当用户触摸触敏式 Windows 7 设备时 xff0c Windows 7 多点触控平台都会向您的应用程序发送手势消息 WM GESTURE 这是现成的免费行为 xff0c 如果您希望停止接收此类消息 xff0c 则需要选择退出 手势被