다음을 통해 공유


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

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

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

실행 중일 때 화면 중앙에 검은색 윤곽선이 있는 흰색 사각형이 있는 c sharp 샘플의 창 터치 제스처를 보여 주는 스크린샷

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

샘플의 작동 방식을 보여 주려면 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 터치 샘플