Share via


Legacyunterstützung für Verschiebungen mit Bildlaufleisten

In diesem Abschnitt wird die Unterstützung für das Schwenken mithilfe von Bildlaufleisten in Windows-basierten Anwendungen beschrieben.

In Windows 7 generieren Verschiebungsgesten WM_*SCROLL-Nachrichten, um die Legacyunterstützung für das Schwenken zu ermöglichen. Da Ihre Anwendungen möglicherweise nicht alle WM_*SCROLL-Nachrichten unterstützen, funktioniert die Verschiebung möglicherweise nicht ordnungsgemäß. In diesem Thema werden die Schritte beschrieben, die Sie ausführen müssen, um sicherzustellen, dass die Legacyverschiebung in Anwendungen erwartungsgemäß funktioniert.

Übersicht

In den folgenden Abschnitten wird erläutert, wie Sie die Legacy-Verschiebung aktivieren:

  • Erstellen Sie eine Anwendung mit Bildlaufleisten.
  • Deaktivieren von Flicks.
  • Passen Sie die Verschiebungsoberfläche an.

Erstellen einer Anwendung mit Bildlaufleisten

Starten Sie ein neues Win32-Projekt mit dem Microsoft Visual Studio-Assistenten. Stellen Sie sicher, dass der Anwendungstyp auf die Windows-Anwendung festgelegt ist. Sie müssen die Unterstützung für die Aktive Vorlagenbibliothek (Active Template Library, ATL) nicht aktivieren. Die folgende Abbildung zeigt, wie Ihr Projekt aussieht, nachdem Sie es gestartet haben.

Screenshot eines Fensters ohne Bildlaufleisten

Aktivieren Sie als Nächstes Bildlaufleisten für das Bild. Ändern Sie den Fenstererstellungscode in InitInstance , sodass der CreateWindow-Funktionsaufruf ein Fenster mit Bildlaufleisten erstellt. Dies wird im folgenden Code veranschaulicht.

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

Nachdem Sie den Fenstererstellungscode geändert haben, verfügt Ihre Anwendung über eine Bildlaufleiste. Die folgende Abbildung zeigt, wie die Anwendung an diesem Punkt aussehen könnte.

Screenshot eines Fensters mit einer vertikalen Bildlaufleiste ohne Text

Nachdem Sie den Code für die Fenstererstellung geändert haben, fügen Sie ihrer Anwendung ein Bildlaufleistenobjekt und text zum Scrollen hinzu. Platzieren Sie den folgenden Code am Anfang der WndProc-Methode .

    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""
     };        

Implementieren Sie als Nächstes die Anwendungslogik zum Konfigurieren der Textberechnungen für Textmetriken. Der folgende Code sollte den vorhandenen WM_CREATE Fall in der WndProc-Funktion ersetzen.

    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;

Implementieren Sie als Nächstes die Anwendungslogik für die Neuberechnung des Textblocks, wenn die Größe des Fensters geändert wird. Der folgende Code sollte in den Nachrichtenschalter in WndProc eingefügt werden.

    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;

Implementieren Sie als Nächstes die Anwendungslogik für vertikale Bildlaufmeldungen. Der folgende Code sollte in den Nachrichtenschalter in WndProc eingefügt werden.

        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;

Aktualisieren Sie als Nächstes den Code, um das Fenster neu zu zeichnen. Der folgende Code sollte den Standard-WM_PAINT Fall in WndProc ersetzen.

    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;

Wenn Sie nun Ihre Anwendung erstellen und ausführen, sollte sie den Text des Textbausteines und eine vertikale Bildlaufleiste enthalten. Die folgende Abbildung zeigt, wie Ihre Anwendung aussehen könnte.

Screenshot: Fenster mit vertikaler Bildlaufleiste und Text

Deaktivieren von Flicks

Um die Verschiebung in Ihrer Anwendung zu verbessern, sollten Sie Flicks deaktivieren. Legen Sie dazu fenstereigenschaften für den hWnd-Wert fest, wenn er initialisiert wird. Die für Flicks verwendeten Werte werden im Tpcshrd.h-Header gespeichert, der ebenfalls eingeschlossen werden muss. Der folgende Code sollte in Ihre include-Direktiven und in die InitInstance-Funktion eingefügt werden, nachdem Sie Ihren hWnd erstellt haben.

Hinweis

Dies ist nützlich für Anwendungen, die sofortiges Feedback zu einem Touch- oder Pendown-Ereignis benötigen, anstatt einen Zeit- oder Entfernungsschwellenwert zu testen.

 

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

Anpassen der Verschiebungserfahrung

Möglicherweise möchten Sie standardmäßig eine andere Verschiebungsoberfläche als Windows 7 bietet. Um die Verschiebung zu verbessern, müssen Sie den Handler für die WM_GESTURE Nachricht hinzufügen. Weitere Informationen finden Sie unter Verbessern der Single-Finger Verschiebungserfahrung.

Windows-Touchgesten