C# 샘플에서 터치 제스처 Windows(MTGesturesCS)

이 섹션에서는 C#의 Windows Touch 제스처 샘플에 대해 설명합니다.

이 Windows 터치 제스처 샘플에서는 제스처 메시지를 사용하여 WM_GESTURE 메시지를 처리하여 GDI(그래픽 디바이스 인터페이스)에서 렌더링한 상자를 변환, 회전 및 크기 조정하는 방법을 보여 줍니다. 다음 스크린샷은 샘플이 실행 중일 때 어떻게 보이는지 보여 집니다.

screen shot showing the windows touch gestures in c sharp sample when it is running, with a black-outlined white rectangle centered on the screen

이 샘플의 경우 제스처 메시지는 제스처 엔진에 전달된 다음, 그리기 개체의 메서드를 호출하여 이러한 명령을 처리하는 메서드가 있는 개체를 변환, 회전 및 크기 조정합니다. C#에서 이를 가능하게 하기 위해 제스처 메시지를 처리하기 위해 특수 양식인 TouchableForm이 만들어집니다. 그런 다음 이 양식은 메시지를 사용하여 그리기 개체인 DrawingObject를 변경하여 그림판 메서드에서 개체가 렌더링되는 방식을 변경합니다.

샘플의 작동 방식을 보여 주기 위해 pan 명령을 사용하여 렌더링된 상자를 번역하는 단계를 고려합니다. 사용자가 제스처 식별자 GID_PAN 사용하여 WM_GESTURE 메시지를 생성하는 이동 제스처를 수행합니다. 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 터치 샘플