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.
Se você criar um aplicativo destinado ao Windows Touch, ele fornecerá automaticamente suporte básico de movimento panorâmico. No entanto, pode utilizar a mensagem WM_GESTURE para fornecer suporte melhorado para movimentação com um dedo.
Visão geral
Para melhorar a experiência ao deslizar com um único dedo, use estas etapas, conforme explicado nas seções subsequentes deste tópico:
- Crie um aplicativo com barras de rolagem e com movimentos desativados.
- Adicione suporte para mensagens de movimento panorâmico por gestos.
- Ativar o bounce
Criar uma aplicação com barras de rolagem e com gestos desativados
Antes de começar, você deve criar um aplicativo com barras de rolagem. A seção Suporte herdado para deslocamento com barras de rolagem explica esse processo. Se pretender começar com o conteúdo de exemplo, vá para essa seção e crie uma aplicação com barras de rolagem e, em seguida, desative os gestos. Se você já tiver um aplicativo com barras de rolagem funcionando, desative os movimentos conforme descrito nessa seção.
Adicionar suporte personalizado para mensagens de pan por gestos
Para suportar mensagens de arrastamento com gestos, deve-se manipulá-las no método WndProc. As mensagens de gesto são usadas para determinar deltas horizontais e verticais para mensagens panorâmicas. Os deltas são usados para atualizar o objeto da barra de rolagem, que atualiza a interface do usuário.
Primeiro, atualize as configurações de versão do Windows no arquivo targetver.h para habilitar o Windows Touch. O código a seguir mostra as várias configurações de versão do Windows que devem substituir as do targetver.h.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
Em seguida, adicione o arquivo UXTheme.h ao seu projeto e adicione a biblioteca uxtheme.lib às dependências adicionais do seu projeto.
#include <uxtheme.h>
Em seguida, adicione as seguintes variáveis à parte superior da função WndProc. Eles serão usados em cálculos para panorâmica.
// The following are used for the custom panning handler
BOOL bResult = FALSE;
static int scale = 8; // altering the scale value will change how fast the page scrolls
static int lastY = 0; // used for panning calculations (initial / previous vertical position)
static int lastX = 0; // used for panning calculations (initial / previous horizontal position)
GESTUREINFO gi;
Em seguida, adicione o manipulador para a mensagem WM_GESTURE para que as barras de rolagem sejam atualizadas com deltas baseados em gestos de deslocação. Isso lhe dá um controle muito mais refinado da panorâmica.
O seguinte código obtém a estrutura GESTUREINFO do lParam, salva a última coordenada y da estrutura e determina a mudança de posição para atualizar o objeto da barra de rolagem. O código a seguir deve ser colocado no WndProc na instrução switch.
case WM_GESTURE:
// Get all the vertial scroll bar information
si.cbSize = sizeof (si);
si.fMask = SIF_ALL;
GetScrollInfo (hWnd, SB_VERT, &si);
yPos = si.nPos;
ZeroMemory(&gi, sizeof(GESTUREINFO));
gi.cbSize = sizeof(GESTUREINFO);
bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi);
if (bResult){
// now interpret the gesture
switch (gi.dwID){
case GID_BEGIN:
lastY = gi.ptsLocation.y;
CloseGestureInfoHandle((HGESTUREINFO)lParam);
break;
// A CUSTOM PAN HANDLER
// COMMENT THIS CASE OUT TO ENABLE DEFAULT HANDLER BEHAVIOR
case GID_PAN:
si.nPos -= (gi.ptsLocation.y - lastY) / scale;
si.fMask = SIF_POS;
SetScrollInfo (hWnd, SB_VERT, &si, TRUE);
GetScrollInfo (hWnd, SB_VERT, &si);
yOverpan -= lastY - gi.ptsLocation.y;
lastY = gi.ptsLocation.y;
if (gi.dwFlags & GF_BEGIN){
BeginPanningFeedback(hWnd);
yOverpan = 0;
} else if (gi.dwFlags & GF_END) {
EndPanningFeedback(hWnd, TRUE);
yOverpan = 0;
}
if (si.nPos == si.nMin || si.nPos >= (si.nMax - si.nPage)){
// we reached the bottom / top, pan
UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA);
}
ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
UpdateWindow (hWnd);
return DefWindowProc(hWnd, message, lParam, wParam);
case GID_ZOOM:
// Add Zoom handler
return DefWindowProc(hWnd, message, lParam, wParam);
default:
// You have encountered an unknown gesture
return DefWindowProc(hWnd, message, lParam, wParam);
}
}else{
DWORD dwErr = GetLastError();
if (dwErr > 0){
// something is wrong
// 87 indicates that you are probably using a bad
// value for the gi.cbSize
}
}
return DefWindowProc (hWnd, message, wParam, lParam);
Agora, quando você executar o gesto pan em sua janela, você verá o texto rolar com inércia. Neste ponto, talvez você queira alterar o texto para ter mais linhas para que você possa explorar o movimento panorâmico de grandes seções de texto.
Feedback de limite no WndProc
O feedback de limitação é um tipo de feedback visual dado aos utilizadores quando eles chegam ao final de uma área navegável. Ele é acionado pelo aplicativo quando um limite é atingido. No exemplo anterior de implementação da mensagem WM_GESTURE, a condição final (si.nPos == si.yPos)
do caso WM_GESTURE é usada para verificar se foi alcançado o final de uma região que pode ser movida em panorama. As variáveis a seguir são usadas para rastrear valores e erros de teste.
// The following are used for panning feedback (Window Bounce)
static int animCount = 0;
static DWORD dwErr = 0;
static BOOL isOverpan = FALSE;
static long xOverpan = 0;
static long yOverpan = 0;
O caso do gesto panorâmico é atualizado para acionar o feedback do limite. O código a seguir ilustra o caso GID_PAN do manipulador de mensagens WM_GESTURE.
case GID_PAN:
si.nPos -= (gi.ptsLocation.y - lastY) / scale;
si.fMask = SIF_POS;
SetScrollInfo (hWnd, SB_VERT, &si, TRUE);
GetScrollInfo (hWnd, SB_VERT, &si);
yOverpan -= lastY - gi.ptsLocation.y;
lastY = gi.ptsLocation.y;
if (gi.dwFlags & GF_BEGIN){
BeginPanningFeedback(hWnd);
yOverpan = 0;
} else if (gi.dwFlags & GF_END) {
EndPanningFeedback(hWnd, TRUE);
yOverpan = 0;
}
if (si.nPos == si.nMin){
// we reached the top, pan upwards in y direction
UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA);
}else if (si.nPos >= (si.nMax - si.nPage)){
// we reached the bottom, pan downwards in y direction
UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA);
}
ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
UpdateWindow (hWnd);
return DefWindowProc(hWnd, message, lParam, wParam);
Agora, a janela da sua aplicação deve fornecer feedback de limite quando um utilizador se desloca além da parte inferior da região da barra de rolagem.
Tópicos relacionados