C# 샘플의 Windows 터치 제스처(MTGesturesCS)
이 섹션에서는 C#의 Windows Touch 제스처 샘플에 대해 설명합니다.
이 Windows Touch 제스처 샘플에서는 제스처 메시지를 사용하여 WM_GESTURE 메시지를 처리하여 GDI(그래픽 디바이스 인터페이스)에서 렌더링한 상자를 변환, 회전 및 크기 조정하는 방법을 보여 줍니다. 다음 스크린샷은 샘플이 실행 중일 때 어떻게 보이는지 보여줍니다.
이 샘플의 경우 제스처 메시지는 제스처 엔진에 전달된 다음, 그리기 개체에 대한 메서드를 호출하여 이러한 명령을 처리하는 메서드가 있는 개체를 변환, 회전 및 크기 조정합니다. 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;
}
(...)
}
이동 제스처로 인해 그려진 상자가 번역됩니다.