Compartir a través de


Compatibilidad heredada con el movimiento panorámico con barras de desplazamiento

En esta sección se describe la compatibilidad con el movimiento panorámico mediante barras de desplazamiento en aplicaciones basadas en Windows.

En Windows 7, los gestos de movimiento panorámico generan mensajes WM_*SCROLL para habilitar la compatibilidad heredada con el movimiento panorámico. Dado que es posible que las aplicaciones no admitan todos los mensajes WM_*SCROLL, es posible que el movimiento panorámico no funcione correctamente. En este tema se describen los pasos que debe seguir para asegurarse de que la experiencia de movimiento panorámico heredada en las aplicaciones funciona según lo previsto por los usuarios.

Información general

En las secciones siguientes se explica cómo habilitar la experiencia de movimiento panorámico heredado:

  • Cree una aplicación con barras de desplazamiento.
  • Deshabilite los parpadeos.
  • Personalice la experiencia de movimiento panorámico.

Creación de una aplicación con barras de desplazamiento

Inicie un nuevo proyecto de Win32 con el Asistente de Microsoft Visual Studio. Asegúrese de que el tipo de aplicación está establecido en la aplicación Windows. No es necesario habilitar la compatibilidad con la biblioteca de plantillas activas (ATL). En la imagen siguiente se muestra el aspecto que tendrá el proyecto después de iniciarlo.

captura de pantalla que muestra una ventana sin barras de desplazamiento

A continuación, habilite las barras de desplazamiento en la imagen. Cambie el código de creación de ventanas en InitInstance para que la llamada de función CreateWindow cree una ventana con barras de desplazamiento. El código siguiente muestra cómo hacerlo.

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

Después de cambiar el código de creación de la ventana, la aplicación tendrá una barra de desplazamiento. En la imagen siguiente se muestra cómo la aplicación podría examinar este punto.

captura de pantalla que muestra una ventana con una barra de desplazamiento vertical, pero sin texto

Después de cambiar el código de creación de la ventana, agregue un objeto de barra de desplazamiento a la aplicación y algún texto para desplazarse. Coloque el código siguiente en la parte superior del método 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""
     };        

A continuación, implemente la lógica de la aplicación para configurar los cálculos de texto para las métricas de texto. El código siguiente debe reemplazar el caso de WM_CREATE existente en la función 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;

A continuación, implemente la lógica de la aplicación para actualizar el bloque de texto cuando se cambie el tamaño de la ventana. El código siguiente debe colocarse en el modificador de mensaje en 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;

A continuación, implemente la lógica de la aplicación para los mensajes de desplazamiento vertical. El código siguiente debe colocarse en el modificador de mensaje en 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;

A continuación, actualice el código para volver a dibujar la ventana. El código siguiente debe reemplazar el caso de WM_PAINT predeterminado en 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;

Ahora, al compilar y ejecutar la aplicación, debe tener el texto reutilizable y una barra de desplazamiento vertical. En la imagen siguiente se muestra el aspecto de la aplicación.

captura de pantalla que muestra una ventana con una barra de desplazamiento vertical y texto

Deshabilitar parpadeos

Para mejorar la experiencia de movimiento panorámico en la aplicación, debe desactivar los parpadeos. Para ello, establezca las propiedades de la ventana en el valor hWnd cuando se inicialice. Los valores usados para parpadeos se almacenan en el encabezado tpcshrd.h, que también se debe incluir. El código siguiente debe colocarse en las directivas include y en la función InitInstance después de haber creado el hWnd.

Nota

Esto es útil para las aplicaciones que requieren comentarios inmediatos sobre un evento táctil o de lápiz en lugar de probar durante un umbral de tiempo o distancia.

 

#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));

Personalización de la experiencia de movimiento panorámico

Es posible que quieras una experiencia de movimiento panorámico diferente de las ofertas de Windows 7 de forma predeterminada. Para mejorar la experiencia de movimiento panorámico, debe agregar el controlador para el mensaje de WM_GESTURE . Para obtener más información, vea Mejorar la experiencia de movimiento panorámico de Single-Finger.

Gestos táctiles de Windows