Amélioration de l’expérience panoramique Single-Finger
Si vous créez une application qui cible Windows Touch, elle fournit automatiquement la prise en charge de la panoramique de base. Toutefois, vous pouvez utiliser le message WM_GESTURE pour fournir une prise en charge améliorée du panoramique d’un doigt.
Vue d’ensemble
Pour améliorer l’expérience de panoramique à un doigt, procédez comme suit, comme expliqué dans les sections suivantes de cette rubrique :
- Créez une application avec des barres de défilement et avec des volets désactivés.
- Ajout de la prise en charge des messages panoramiques de mouvement.
- Activez le rebond.
Créer une application avec des barres de défilement et avec Flicks désactivés
Avant de commencer, vous devez créer une application avec des barres de défilement. La section Prise en charge héritée du panoramique avec des barres de défilement explique ce processus. Si vous souhaitez commencer par l’exemple de contenu, accédez à cette section et créez une application avec des barres de défilement, puis désactivez les mouvements de mouvement. Si vous disposez déjà d’une application avec des barres de défilement fonctionnelles, désactivez les mouvements de mouvement comme décrit dans cette section.
Ajouter la prise en charge du panoramique personnalisé pour les messages de panoramique de mouvement
Pour prendre en charge les messages panoramiques de mouvement, vous devez les gérer dans la méthode WndProc . Les messages de mouvement sont utilisés pour déterminer les deltas horizontaux et verticaux des messages panoramiques. Les deltas sont utilisés pour mettre à jour l’objet de barre de défilement, qui met à jour l’interface utilisateur.
Tout d’abord, mettez à jour les paramètres de version de Windows dans le fichier targetver.h pour activer Windows Touch. Le code suivant montre les différents paramètres de version de Windows qui doivent remplacer ceux de 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
Ensuite, ajoutez le fichier UXTheme.h à votre projet et ajoutez la bibliothèque uxtheme.lib aux dépendances supplémentaires de votre projet.
#include <uxtheme.h>
Ensuite, ajoutez les variables suivantes en haut de la fonction WndProc . Ceux-ci seront utilisés dans les calculs pour le panoramique.
// 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;
Ensuite, ajoutez le gestionnaire pour le message WM_GESTURE afin que les barres de défilement soient mises à jour avec des deltas en fonction des mouvements de panoramique. Cela vous donne un contrôle beaucoup plus fin de la panoramique.
Le code suivant obtient la structure GESTUREINFO à partir de l’objet lParam, enregistre la dernière coordonnée y de la structure et détermine le changement de position pour mettre à jour l’objet de barre de défilement. Le code suivant doit être placé dans votre instruction de commutateur WndProc .
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);
Maintenant, lorsque vous effectuez le mouvement panoramique sur votre fenêtre, vous voyez le texte défiler avec inertie. À ce stade, vous souhaiterez peut-être modifier le texte afin d’avoir plus de lignes afin de pouvoir explorer les grandes sections de texte.
Commentaires sur les limites dans WndProc
Les commentaires de limites sont un type de commentaires visuels donnés aux utilisateurs lorsqu’ils atteignent la fin d’une zone panoramique. Elle est déclenchée par l’application lorsqu’une limite est atteinte. Dans l’exemple d’implémentation précédent du message WM_GESTURE , la condition (si.nPos == si.yPos)
de fin du cas WM_GESTURE est utilisée pour tester que vous avez atteint la fin d’une région panoramique. Les variables suivantes sont utilisées pour suivre les valeurs et tester les erreurs.
// 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;
Le cas de mouvement panoramique est mis à jour pour déclencher des commentaires sur les limites. Le code suivant illustre le cas GID_PAN du gestionnaire de messages 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);
À présent, la fenêtre de votre application doit avoir des commentaires sur les limites lorsqu’un utilisateur effectue un panoramique au-delà du bas de la zone de la barre de défilement.
Rubriques connexes