C# 中的 Windows 触控手势示例 (MTGesturesCS)
本部分介绍 C# 中的 Windows 触控手势示例。
此 Windows 触摸手势示例演示如何使用手势消息通过处理 WM_GESTURE消息来 翻译、旋转和缩放图形设备接口 (GDI) 呈现的框。 以下屏幕截图显示了示例在运行时的外观。
对于此示例,手势消息将传递到手势引擎,该引擎随后调用绘制对象的方法,以转换、旋转和缩放具有处理这些命令的方法的对象。 为了在 C# 中实现此操作,我们创建了一个特殊窗体 TouchableForm 来处理手势消息。 然后,此窗体使用消息对绘图对象 DrawingObject 进行更改,以更改对象在 Paint 方法中的呈现方式。
为了帮助显示示例的工作原理,请考虑使用平移命令转换呈现框的步骤。 用户执行平移手势,该手势使用手势标识符 GID_PAN 生成WM_GESTURE消息。 TouchableForm 处理此消息并更新绘图对象的位置,然后对象将呈现自己已转换。
下面的代码演示了笔势处理程序如何从 WM_GESTURE 消息中检索参数,然后通过调用绘图对象的 move 方法对呈现的框执行转换。
switch (gi.dwID)
{
case GID_BEGIN:
case GID_END:
break;
(...)
case GID_PAN:
switch (gi.dwFlags)
{
case GF_BEGIN:
_ptFirst.X = gi.ptsLocation.x;
_ptFirst.Y = gi.ptsLocation.y;
_ptFirst = PointToClient(_ptFirst);
break;
default:
// We read the second point of this gesture. It is a
// middle point between fingers in this new position
_ptSecond.X = gi.ptsLocation.x;
_ptSecond.Y = gi.ptsLocation.y;
_ptSecond = PointToClient(_ptSecond);
// We apply move operation of the object
_dwo.Move(_ptSecond.X - _ptFirst.X, _ptSecond.Y - _ptFirst.Y);
Invalidate();
// We have to copy second point into first one to
// prepare for the next step of this gesture.
_ptFirst = _ptSecond;
break;
}
break;
以下代码显示绘图对象的 move 方法如何更新内部位置变量。
public void Move(int deltaX,int deltaY)
{
_ptCenter.X += deltaX;
_ptCenter.Y += deltaY;
}
以下代码演示如何在绘图对象的画图方法中使用位置。
public void Paint(Graphics graphics)
{
(...)
for (int j = 0; j < 5; j++)
{
int idx = arrPts[j].X;
int idy = arrPts[j].Y;
// rotation
arrPts[j].X = (int)(idx * dCos + idy * dSin);
arrPts[j].Y = (int)(idy * dCos - idx * dSin);
// translation
arrPts[j].X += _ptCenter.X;
arrPts[j].Y += _ptCenter.Y;
}
(...)
}
平移手势将导致绘制的框呈现为翻译。