Exemplo de Gestos de Toque do Windows em C# (MTGesturesCS)
Esta seção descreve o exemplo gestos de toque do Windows em C#.
Este exemplo de Gestos de Toque do Windows demonstra como usar mensagens de gesto para traduzir, girar e dimensionar uma caixa renderizada pela GDI (Interface do Dispositivo Gráfico) manipulando a mensagem WM_GESTURE . A captura de tela a seguir mostra a aparência do exemplo quando ele está em execução.
Para este exemplo, as mensagens de gesto são passadas para um mecanismo de gestos que, em seguida, chama métodos em objetos de desenho para traduzir, girar e dimensionar um objeto que tem métodos para lidar com esses comandos. Para tornar isso possível em C#, um formulário especial, TouchableForm, é criado para lidar com mensagens de gesto. Esse formulário usa as mensagens para fazer alterações em um objeto de desenho, DrawingObject, para alterar a forma como o objeto é renderizado no método Paint.
Para ajudar a mostrar como o exemplo funciona, considere as etapas para usar o comando pan para traduzir a caixa renderizada. Um usuário executa o gesto de painel que gera uma mensagem WM_GESTURE com o identificador de gesto GID_PAN. O TouchableForm manipula essas mensagens e atualiza a posição do objeto de desenho e, em seguida, o objeto será renderizado traduzido.
O código a seguir mostra como o manipulador de gestos recupera parâmetros da mensagem WM_GESTURE e executa a tradução na caixa renderizada por meio de uma chamada para o método de movimentação do objeto de desenho.
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;
O código a seguir mostra como o método de movimentação do objeto de desenho atualiza variáveis de posição internas.
public void Move(int deltaX,int deltaY)
{
_ptCenter.X += deltaX;
_ptCenter.Y += deltaY;
}
O código a seguir mostra como a posição é usada no método de pintura do objeto de desenho.
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;
}
(...)
}
Gestos de painel farão com que a caixa desenhada seja renderizada traduzida.
Tópicos relacionados
Aplicativo gestos de vários toques (C#), aplicativo de gestos de vários toques (C++), exemplos do Windows Touch