Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Esta seção descreve o exemplo de 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 (Graphics Device Interface) 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 tenha métodos para manipular esses comandos. Para tornar isso possível em C#, um formulário especial, TouchableForm, é criado para lidar com mensagens de gestos. Em seguida, esse formulário usa as mensagens para fazer alterações em um objeto de desenho, DrawingObject, para alterar 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 utilizador executa o gesto de deslocamento 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 o objeto será traduzido.
O código a seguir mostra como o manipulador de gestos recupera parâmetros da mensagem WM_GESTURE e, em seguida, executa a conversão na caixa renderizada por meio de uma chamada para o método move 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 move do objeto de desenho atualiza as 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;
}
(...)
}
Os gestos de arrastar farão com que a caixa desenhada seja movida.
Tópicos relacionados
Aplicativo de Gestos Multitoque (C#) Aplicativo de Gestos Multitoque (C++) Exemplos de Toque do Windows