windows7触屏编程

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/3414700.html

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

windows7触屏编程 的相关文章

随机推荐

  • Unity VR游戏开发干货教程:优化VR体验

    简介 对于VR应用来说 xff0c 如果想要让用户获得好的用户体验 xff0c 特别是免除恶心眩晕的困扰 xff0c 在VR开发中进行优化是必不可少的 xff0c 惟其如此才能达到我们期望的游戏运行帧速 和其它平台上的开发不同 xff0c
  • kali-linux docker桌面版部署

    Dockerfile 构建镜像参考 kali desktop kali docker 桌面版Dockerfile 部署方式 docker run privileged name kali desktop p 5901 5901 p 6080
  • C语言isalpha函数介绍、示例和实现

    文章目录 1 包含头文件2 函数声明3 功能说明4 示例5 自定义的isalpha函数的实现方法6 获取视频教程7 版权声明 isalpha函数用于判断字符是否为字母 xff08 a z和A Z xff09 在本文中 xff0c 我们先来介
  • C语言isalnum函数介绍、示例和实现

    文章目录 1 包含头文件2 函数声明3 功能说明4 示例5 自定义的isalnum函数的实现方法6 获取视频教程7 版权声明 C语言isalnum函数用于判断字符是否为字母 xff08 a z和A Z xff09 或数字 xff08 0 9
  • 企业对C/C++程序员的技能要求

    一个人应该具备对事物的思考能力 xff0c 否则容易被忽悠 对大部分未入门或刚入门的菜鸟来说 xff0c 很难搞明白C语言能做什么和C程序员在做什么这两个问题 如果你打算种菜 xff0c 必须先了解行情 xff08 包括销量和价钱 xff0
  • HBase详解(对hbase集群搭建、读写流程、hbase的javaApi等细致入微的讲解与保姆级的图解)

    学HBase的意义是什么 我本想用MySQL来与HBase作比较 xff0c 但发现他们两者毫无可比性 xff0c 因为两者运用领域不同 xff0c 各自有各自的优点 xff0c 就好比爬山穿登山鞋 xff0c 潜水穿脚蹼一般 一门技术的兴
  • 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 原因

    使用VS2012版本引用外部的lib进行编译时候提示 xff1a 1 gt libprotobuf lib common obj error LNK2038 检测到 ITERATOR DEBUG LEVEL 的不匹配项 值 0 不匹配值 2
  • 写给大侄女

    老姑从你上高中开始 xff0c 就想写点东西给大侄女看 xff0c 不过老姑理科出身 xff0c 文笔比较差 不知道该不该提你在学校看手机的事情 xff0c 老姑没有责备你的意思 xff0c 只是和你探讨一下 xff0c 毕竟谁没有年轻的时
  • centos安装lspci工具

    背景 由于centos6 3迷你安装版上没有带lspci工具 在定制内核时 无法用此工具查询硬件相关信息 具体步骤如下 1 下载 pci包 xff1a http www kernel org pub software utils pciut
  • 软件性能测试方法论

    软件性能测试过程详解与案例分析 xff08 段念 编著 xff09 学习笔记三 1 SEI负载测试计划过程 SEI load Testing Planning Process是一个关注于负载测试计划的方法 xff0c 其目标是产生 清晰 易
  • 2011年总结&2012年展望

    再有几天就2012了 xff0c 工作三年多了 xff0c 之前也没写过总结 xff0c 感觉总结这东西写写也挺好的 xff0c 可以思考下过去和未来 xff0c 留个底 xff0c 可以作为日后的对比 xff1b 总结我的2011年 xf
  • Linux查看端口使用状态、关闭端口方法

    前提 xff1a 首先你必须知道 xff0c 端口不是独立存在的 xff0c 它是依附于进程的 某个进程开启 xff0c 那么它对应的端口就开启了 xff0c 进程关闭 xff0c 则该端口也就关闭了 下次若某个进程再次开启 xff0c 则
  • 查找列表中某个值的位置(python)

    p 61 list index value list为列表的名字 value为查找的值 p为value在list的位置 以下内容引自 xff1a http www linuxidc com Linux 2012 01 51638 htm P
  • python 等待一定时间后继续执行其后的程序

    简单示例 xff1a import time print 39 11 39 time sleep 10 print 39 22 39 先打印11 xff0c 等待10秒后 xff0c 打印22
  • Linux下用于查看系统当前登录用户信息的4种方法

    作为系统管理员 xff0c 你可能经常会 xff08 在某个时候 xff09 需要查看系统中有哪些用户正在活动 有些时候 xff0c 你甚至需要知道他 xff08 她 xff09 们正在做什么 本文为我们总结了4种查看系统用户信息 xff0
  • TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义

    TCP SYN ACK FIN RST PSH URG简析 三次握手Three way Handshake 一个虚拟连接的建立是通过三次握手来实现的 1 B gt SYN gt A 假如服务器A和客户机B通讯 当A要和B通信时 xff0c
  • [转载]一次 JMeter 脚本请求错误 HTTP Status 415 的解决笔记

    录制好脚本以后 xff0c 使用 JMeter 打开 xff0c 直接运行测试 xff0c 发现有个 Ajax 提交表单的时候出错了 服务器返回信息如下 xff1a HTTP Status 415 type Status report me
  • python list转换字符串报错TypeError: sequence item 0: expected str instance, int found

    今天敲小例子 xff0c 报了错TypeError sequence item 0 expected str instance int found 小例子 xff1a list1 61 1 39 two 39 39 three 39 4 p
  • Linux下使用 xrandr 命令设置屏幕分辨率

    最近在Linux下修改屏幕分辨率的时候 xff0c 发现了一个非常有用的命令 xff1a xrandr 使用这个命令 xff0c 可以方便的设置您显示器的的分辨率 尤其是当你使用了一些需要或者会自动改动您屏幕分辨率的程序以后 您可以使用如下
  • windows7触屏编程

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