Поделиться через


Пример сенсорных жестов Windows в C# (MTGesturesCS)

В этом разделе описывается пример сенсорных жестов Windows на C#.

В этом примере сенсорных жестов Windows показано, как использовать сообщения жестов для перевода, поворота и масштабирования поля, отображаемого интерфейсом графических устройств (GDI), путем обработки сообщения WM_GESTURE . На следующем снимке экрана показано, как выглядит пример при его выполнении.

Снимок экрана, показывающий сенсорные жесты Windows в примере c sharp при выполнении, с черным контуром белого прямоугольника по центру экрана

В этом примере сообщения жестов передаются обработчику жестов, который затем вызывает методы для рисования объектов для преобразования, поворота и масштабирования объекта, который имеет методы для обработки этих команд. Чтобы сделать это возможным в 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;
        }

В следующем коде показано, как позиция используется в методе paint объекта рисования.

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