Жесты сенсорного ввода Windows в примере C# (MTGesturesCS)
В этом разделе описан пример жестов Windows Touch в C#.
В этом примере жестов Windows показано, как использовать сообщения жестов для перевода, поворота и масштабирования поля, отрисоваемого интерфейсом графических устройств (GDI), обрабатывая сообщение WM_GESTURE. На следующем снимке экрана показано, как выглядит образец во время работы.
В этом примере сообщения жестов передаются в обработчик жестов, который затем вызывает методы рисования объектов для преобразования, поворота и масштабирования объекта, имеющего методы обработки этих команд. Чтобы сделать это возможным в C#, создается специальная форма TouchableForm для обработки сообщений жестов. Затем эта форма использует сообщения для внесения изменений в объект рисования, DrawingObject, чтобы изменить способ отрисовки объекта в методе Paint.
Чтобы показать, как работает пример, рассмотрим шаги по использованию команды сдвига для перевода отрисованного поля. Пользователь выполняет жест сдвига, который создает сообщение WM_GESTURE с идентификатором жеста GID_PAN. TouchableForm обрабатывает эти сообщения и обновляет положение объекта рисования, и затем объект будет отрисован с обновленным положением.
В следующем коде показано, как обработчик жестов извлекает параметры из сообщения WM_GESTURE, а затем выполняет перевод в отрисованном поле с помощью вызова метода перемещения объекта рисования.
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;
В следующем коде показано, как метод перемещения объекта рисования обновляет внутренние переменные положения.
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;
}
(...)
}
Жесты панорамирования изменяют отрисовку прямоугольника.
Связанные разделы
Приложение «Мультисенсорные жесты» (C#), Приложение «Мультисенсорные жесты» (C++), Образцы Windows Touch