windows7中的多点触控中的手势

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

 

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:

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 默认手势与以上所述的特定缩放手势处理非常相似。所有手势都遵循相同的流程,只是在每个使用案例场景中,每个手势的内部逻辑实现有所不同。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WinForms是微软的一个桌面应用程序开发框架,用于创建Windows操作系统上的图形用户界面。然而,WinForms在多点触控方面的功能相对较弱。 要支持WinForms多点触控,我们可以使用.NET框架的一些技术和类库。首先,我们需要将应用程序的TargetFramework设置为.NET Framework 4.6或更高版本,以便能够使用最新的触控功能。 在WinForms,我们可以使用Control类的一些事件和属性来处理多点触控。例如,我们可以使用Control类的MouseEnter、MouseMove和MouseLeave事件来追踪触摸设备的位置和动作。另外,我们还可以使用Control类的Handle属性来获取控件的句柄,以便与Windows操作系统的触控事件进行交互。 此外,我们还可以使用.NET Framework的WPF(Windows Presentation Foundation)来实现更高级的多点触控功能。WPF是一个用于创建富客户端应用程序的框架,它提供了更强大和灵活的触控支持。在WPF,我们可以使用Touch类和触摸事件来处理多点触控。 总的来说,WinForms对于多点触控的支持相对较弱,但是我们可以通过使用.NET Framework的一些技术和类库来实现一些基本的多点触控功能。如果需要更高级的多点触控功能,则建议使用WPF来开发应用程序。 ### 回答2: Winform是微软Windows操作系统下的一种图形用户界面应用程序的开发框架,用于构建Windows桌面应用程序。然而,Winform并不原生支持多点触控。 要实现Winform多点触控功能,可以借助第三方库或手动实现。其一种方法是使用Microsoft Surface SDK或TouchToolkit,它们提供了一些用于处理触控输入的类和控件,可以实现多点触控的支持。这些库通常提供了手势识别、滑动、旋转和缩放等常见的多点触控操作功能。 另一种方法是通过手动捕获和处理原始的触控输入信息。可以在Winform应用程序重写WndProc方法,并使用Windows消息机制来处理WM_TOUCH消息,从而获取触控输入的信息。然后,可以使用这些信息来实现自定义的多点触控交互逻辑。 无论使用哪种方法,都需要在程序实现对触控事件的处理逻辑。可以通过在触控事件处理程序使用适当的代码来响应不同的触控手势,例如单击、双击、长按、滑动等。同时,还可以根据需要对控件进行布局调整,以适应不同的屏幕尺寸和触控操作。 需要注意的是,Winform作为一种传统的桌面应用程序开发框架,其多点触控的支持相对较弱。如果需要更丰富的多点触控功能,推荐考虑使用更为现代的UI开发框架,如WPF或UWP。这些框架提供了更为强大和易用的多点触控支持,可以满足更复杂的用户交互需求。 ### 回答3: WinForms是一种用于开发Windows桌面应用程序的框架,它提供了一系列的UI控件和功能,用于创建丰富的用户界面。然而,WinForms并没有直接支持多点触控的能力,因为它是在较早的时期开发的,当时多点触控并不是主流。 要在WinForms应用程序实现多点触控,我们可以借助一些第三方库或基于WinForms的扩展来实现。这些库或扩展通常提供了额外的控件和事件来处理多点触控操作。 一种常见的方法是使用TouchHook库来捕获触摸事件。TouchHook是一个高级触摸输入库,它实现了自定义的触摸事件处理逻辑。通过使用TouchHook,我们可以在WinForms应用程序捕获并处理各种触摸手势,例如滑动、缩放、旋转等。 另一种方法是使用基于WinForms的扩展库,如TeeChart.NET。TeeChart.NET提供了一系列的触摸友好的图表控件,可以通过手势实现图表的交互操作。使用TeeChart.NET,我们可以轻松地在WinForms应用程序实现触摸导航、缩放和平移等功能。 除了使用第三方库和扩展,我们还可以通过自定义绘制和事件处理来实现基本的多点触控功能。通过捕获鼠标事件和触摸事件,我们可以确定触摸点的位置和操作,并相应地更新UI。 总结来说,虽然WinForms本身并没有原生支持多点触控,但我们可以通过使用第三方库、扩展或自定义绘制和事件处理来实现多点触控功能。这些方法可以帮助我们在WinForms应用程序创建更具交互性和触摸友好的用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值