Supporto legacy per la panoramica con barre di scorrimento

Questa sezione descrive il supporto per la panoramica usando le barre di scorrimento nelle applicazioni basate su Windows.

In Windows 7 i movimenti di panoramica generano messaggi WM_*SCROLL per abilitare il supporto legacy per la panoramica. Poiché le applicazioni potrebbero non supportare tutti i messaggi WM_*SCROLL, la panoramica potrebbe non funzionare correttamente. In questo argomento vengono descritti i passaggi da eseguire per garantire che l'esperienza di panoramica legacy nelle applicazioni funzioni come previsto dagli utenti.

Panoramica

Le sezioni seguenti illustrano come abilitare l'esperienza di panoramica legacy:

  • Creare un'applicazione con barre di scorrimento.
  • Disabilitare le leccate.
  • Personalizzare l'esperienza di panoramica.

Creare un'applicazione con barre di scorrimento

Avviare un nuovo progetto Win32 usando la procedura guidata di Microsoft Visual Studio. Assicurarsi che il tipo di applicazione sia impostato sull'applicazione Windows. Non è necessario abilitare il supporto per Active Template Library (ATL). L'immagine seguente mostra l'aspetto del progetto dopo l'avvio.

screenshot che mostra una finestra senza barre di scorrimento

Abilitare quindi le barre di scorrimento nell'immagine. Modificare il codice di creazione della finestra in InitInstance in modo che la chiamata di funzione CreateWindow crei una finestra con barre di scorrimento. A tal fine, osservare il codice indicato di seguito.

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

Dopo aver modificato il codice di creazione della finestra, l'applicazione avrà una barra di scorrimento. L'immagine seguente illustra come l'applicazione potrebbe esaminare questo punto.

screenshot che mostra una finestra con una barra di scorrimento verticale, ma senza testo

Dopo aver modificato il codice di creazione della finestra, aggiungere un oggetto barra di scorrimento all'applicazione e un testo da scorrere. Inserire il codice seguente nella parte superiore del metodo 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""
     };        

Implementare quindi la logica dell'applicazione per configurare i calcoli di testo per le metriche di testo. Il codice seguente deve sostituire il caso WM_CREATE esistente nella funzione 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;

Implementare quindi la logica dell'applicazione per il ricalcolo del blocco di testo quando la finestra viene ridimensionata. Il codice seguente deve essere inserito nell'opzione del messaggio in 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;

Implementare quindi la logica dell'applicazione per i messaggi di scorrimento verticale. Il codice seguente deve essere inserito nell'opzione del messaggio in 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;

Aggiornare quindi il codice per ridisegnare la finestra. Il codice seguente deve sostituire il caso predefinito WM_PAINT in 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;

Ora, quando si compila ed esegue l'applicazione, il testo boilerplate e una barra di scorrimento verticale. L'immagine seguente mostra l'aspetto dell'applicazione.

screenshot che mostra una finestra con una barra di scorrimento verticale e testo

Disabilitare le leccate

Per migliorare l'esperienza di panoramica nell'applicazione, è consigliabile disattivare i scorrere. A tale scopo, impostare le proprietà della finestra sul valore hWnd quando viene inizializzato. I valori usati per le scorrere vengono archiviati nell'intestazione tpcshrd.h, che deve essere inclusa anche. Il codice seguente deve essere inserito nelle direttive di inclusione e nella funzione InitInstance dopo aver creato hWnd.

Nota

Ciò è utile per le applicazioni che richiedono un feedback immediato su un evento di tocco o penna verso il basso invece di testare una soglia di tempo o distanza.

 

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

Personalizzare l'esperienza di panoramica

Potresti volere un'esperienza di panoramica diversa rispetto alle offerte di Windows 7 per impostazione predefinita. Per migliorare l'esperienza di panoramica, è necessario aggiungere il gestore per il messaggio WM_GESTURE . Per altre informazioni, vedere Miglioramento dell'esperienza di panoramica Single-Finger.

Movimenti tocco di Windows