Partager via


Prise en charge héritée du mouvement panoramique avec barres de défilement

Cette section décrit la prise en charge du mouvement panoramique à l’aide de barres de défilement dans les applications Windows.

Dans Windows 7, les mouvements panoramiques génèrent des messages WM_*SCROLL pour activer la prise en charge héritée du mouvement panoramique. Étant donné que vos applications peuvent ne pas prendre en charge tous les messages WM_*SCROLL, le mouvement panoramique peut ne pas fonctionner correctement. Cette rubrique décrit les étapes à suivre pour vous assurer que l’expérience de mouvement panoramique héritée dans les applications fonctionne comme prévu par les utilisateurs.

Vue d’ensemble

Les sections suivantes expliquent comment activer l’expérience de mouvement panoramique héritée :

  • Créez une application avec des barres de défilement.
  • Désactiver les raccourcis.
  • Personnalisez l’expérience de mouvement panoramique.

Créer une application avec des barres de défilement

Démarrez un nouveau projet Win32 à l’aide de l’Assistant Microsoft Visual Studio. Vérifiez que le type d’application est défini sur l’application Windows. Vous n’avez pas besoin d’activer la prise en charge de la bibliothèque active de modèles (ATL). L’image suivante montre à quoi ressemblera votre projet une fois que vous l’aurez démarré.

capture d’écran montrant une fenêtre sans barres de défilement

Ensuite, activez les barres de défilement sur l’image. Modifiez le code de création de fenêtre dans InitInstance afin que l’appel de fonction CreateWindow crée une fenêtre avec des barres de défilement. Le code suivant montre comment procéder.

   hWnd = CreateWindow(
      szWindowClass, 
      szTitle, 
      WS_OVERLAPPEDWINDOW | WS_VSCROLL,  // style
      200,                               // x
      200,                               // y
      550,                               // width
      300,                               // height
      NULL,
      NULL,
      hInstance,
      NULL
    );  

Une fois que vous avez modifié le code de création de fenêtre, votre application dispose d’une barre de défilement. L’image suivante montre comment l’application peut se présenter à ce stade.

capture d’écran montrant une fenêtre avec une barre de défilement verticale mais aucun texte

Après avoir modifié le code de création de fenêtre, ajoutez un objet barre de défilement à votre application et du texte à faire défiler. Placez le code suivant en haut de la méthode WndProc .

    TEXTMETRIC tm;     
    SCROLLINFO si; 
     
    // These variables are required to display text. 
    static int xClient;     // width of client area 
    static int yClient;     // height of client area 
    static int xClientMax;  // maximum width of client area 
     
    static int xChar;       // horizontal scrolling unit 
    static int yChar;       // vertical scrolling unit 
    static int xUpper;      // average width of uppercase letters 
     
    static int xPos;        // current horizontal scrolling position 
    static int yPos;        // current vertical scrolling position 
     
    int i;                  // loop counter 
    int x, y;               // horizontal and vertical coordinates
     
    int FirstLine;          // first line in the invalidated area 
    int LastLine;           // last line in the invalidated area 
    HRESULT hr;
    int abcLength = 0;  // length of an abc[] item

    int lines = 0;

    // Create an array of lines to display. 
    static const int LINES=28;
    static LPCWSTR abc[] = { 
       L"anteater",  L"bear",      L"cougar", 
       L"dingo",     L"elephant",  L"falcon", 
       L"gazelle",   L"hyena",     L"iguana", 
       L"jackal",    L"kangaroo",  L"llama", 
       L"moose",     L"newt",      L"octopus", 
       L"penguin",   L"quail",     L"rat", 
       L"squid",     L"tortoise",  L"urus", 
       L"vole",      L"walrus",    L"xylophone", 
       L"yak",       L"zebra",
       L"This line contains words, but no character. Go figure.",
       L""
     };        

Ensuite, implémentez la logique d’application pour configurer les calculs de texte pour les métriques de texte. Le code suivant doit remplacer le cas de WM_CREATE existant dans la fonction WndProc .

    case WM_CREATE : 
        // Get the handle to the client area's device context. 
        hdc = GetDC (hWnd); 
 
        // Extract font dimensions from the text metrics. 
        GetTextMetrics (hdc, &tm); 
        xChar = tm.tmAveCharWidth; 
        xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * xChar/2; 
        yChar = tm.tmHeight + tm.tmExternalLeading; 
 
        // Free the device context. 
        ReleaseDC (hWnd, hdc); 
 
        // Set an arbitrary maximum width for client area. 
        // (xClientMax is the sum of the widths of 48 average 
        // lowercase letters and 12 uppercase letters.) 
        xClientMax = 48 * xChar + 12 * xUpper; 
 
        return 0;

Ensuite, implémentez la logique d’application pour recalculer le bloc de texte lorsque la fenêtre est redimensionnée. Le code suivant doit être placé dans le commutateur de messages dans WndProc.

    case WM_SIZE: 
 
        // Retrieve the dimensions of the client area. 
        yClient = HIWORD (lParam); 
        xClient = LOWORD (lParam); 
 
        // Set the vertical scrolling range and page size
        si.cbSize = sizeof(si); 
        si.fMask  = SIF_RANGE | SIF_PAGE; 
        si.nMin   = 0; 
        si.nMax   = LINES - 1; 
        si.nPage  = yClient / yChar; 
        SetScrollInfo(hWnd, SB_VERT, &si, TRUE); 
 
        // Set the horizontal scrolling range and page size. 
        si.cbSize = sizeof(si); 
        si.fMask  = SIF_RANGE | SIF_PAGE; 
        si.nMin   = 0; 
        si.nMax   = 2 + xClientMax / xChar; 
        si.nPage  = xClient / xChar; 
        SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);            
        return 0;

Ensuite, implémentez la logique d’application pour les messages à défilement vertical. Le code suivant doit être placé dans le commutateur de messages dans WndProc.

        case WM_VSCROLL:
         // Get all the vertical scroll bar information
         si.cbSize = sizeof (si);
         si.fMask  = SIF_ALL;
         GetScrollInfo (hWnd, SB_VERT, &si);
         // Save the position for comparison later on
         yPos = si.nPos;
         switch (LOWORD (wParam))
         {
         // user clicked the HOME keyboard key
         case SB_TOP:
             si.nPos = si.nMin;
             break;
              
         // user clicked the END keyboard key
         case SB_BOTTOM:
             si.nPos = si.nMax;
             break;
              
         // user clicked the top arrow
         case SB_LINEUP:
             si.nPos -= 1;
             break;
              
         // user clicked the bottom arrow
         case SB_LINEDOWN:
             si.nPos += 1;
             break;
              
         // user clicked the scroll bar shaft above the scroll box
         case SB_PAGEUP:
             si.nPos -= si.nPage;
             break;
              
         // user clicked the scroll bar shaft below the scroll box
         case SB_PAGEDOWN:
             si.nPos += si.nPage;
             break;
              
         // user dragged the scroll box
         case SB_THUMBTRACK:
             si.nPos = si.nTrackPos;
             break;

         // user positioned the scroll box
         // This message is the one used by Windows Touch
         case SB_THUMBPOSITION:
             si.nPos = HIWORD(wParam);
             break;
                            
         default:
              break; 
         }
         // Set the position and then retrieve it.  Due to adjustments
         //   by Windows it may not be the same as the value set.
         si.fMask = SIF_POS;
         SetScrollInfo (hWnd, SB_VERT, &si, TRUE);
         GetScrollInfo (hWnd, SB_VERT, &si);
         // If the position has changed, scroll window and update it
         if (si.nPos != yPos)
         {                    
          ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
          UpdateWindow (hWnd);
         }
         break;

Ensuite, mettez à jour le code pour redessiner la fenêtre. Le code suivant doit remplacer le cas de WM_PAINT par défaut dans WndProc.

    case WM_PAINT:
         // Prepare the window for painting
         hdc = BeginPaint (hWnd, &ps);
         // Get vertical scroll bar position
         si.cbSize = sizeof (si);
         si.fMask  = SIF_POS;
         GetScrollInfo (hWnd, SB_VERT, &si);
         yPos = si.nPos;
         // Get horizontal scroll bar position
         GetScrollInfo (hWnd, SB_HORZ, &si);
         xPos = si.nPos;
         // Find painting limits
         FirstLine = max (0, yPos + ps.rcPaint.top / yChar);
         LastLine = min (LINES - 1, yPos + ps.rcPaint.bottom / yChar);
         
         
         
         for (i = FirstLine; i <= LastLine; i++)         
         {
              x = xChar * (1 - xPos);
              y = yChar * (i - yPos);
              
              // Note that "55" in the following depends on the 
              // maximum size of an abc[] item.
              //
              abcLength = wcslen(abc[i]);
              hr = S_OK;
              if ((FAILED(hr)))
              {
                 MessageBox(hWnd, L"err", L"err", NULL);
              }else{
                  TextOut(hdc, x, y, abc[i], abcLength);
              }
              
         }
         // Indicate that painting is finished
         EndPaint (hWnd, &ps);
         return 0;

À présent, lorsque vous générez et exécutez votre application, elle doit avoir le texte réutilisable et une barre de défilement verticale. L’image suivante montre à quoi votre application peut ressembler.

capture d’écran montrant une fenêtre avec une barre de défilement verticale et du texte

Désactiver les touches

Pour améliorer l’expérience de mouvement panoramique dans votre application, vous devez désactiver les mouvements. Pour ce faire, définissez les propriétés de la fenêtre sur la valeur hWnd lors de son initialisation. Les valeurs utilisées pour les mouvements sont stockées dans l’en-tête tpcshrd.h, qui doit également être inclus. Le code suivant doit être placé dans vos directives include et dans la fonction InitInstance une fois que vous avez créé votre hWnd.

Notes

Cela est utile pour les applications qui nécessitent un retour d’information immédiat sur un événement tactile ou de stylet vers le bas au lieu de tester un seuil de temps ou de distance.

 

#include <tpcshrd.h>
[...]
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
[...]
  
   const DWORD_PTR dwHwndTabletProperty = 
    TABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture
    TABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves)
    TABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down (circle)
    TABLET_DISABLE_FLICKS; // disables pen flicks (back, forward, drag down, drag up)
   
   SetProp(hWnd, MICROSOFT_TABLETPENSERVICE_PROPERTY, reinterpret_cast<HANDLE>(dwHwndTabletProperty));

Personnaliser l’expérience panoramique

Vous souhaiterez peut-être une expérience de mouvement panoramique différente de celle des offres Windows 7 par défaut. Pour améliorer l’expérience de mouvement panoramique, vous devez ajouter le gestionnaire pour le message WM_GESTURE . Pour plus d’informations, consultez Amélioration de l’expérience panoramique Single-Finger.

Mouvements tactiles Windows