Legacyunterstützung für die Verschiebung mit Bildlaufleisten

In diesem Abschnitt wird die Unterstützung für die Verschiebung mit Bildlaufleisten in Windows-basierten Anwendungen beschrieben.

In Windows 7 werden durch Verschiebungsgesten WM_*SCROLL-Meldungen generiert, um die Legacyunterstützung für die Verschiebung zu aktivieren. Da Ihre Anwendungen möglicherweise nicht alle WM_*SCROLL-Meldungen unterstützen, funktioniert die Verschiebung eventuell nicht ordnungsgemäß. In diesem Thema werden die Schritte beschrieben, die Sie durchführen müssen, um sicherzustellen, dass die Legacyverschiebungsfunktion in Anwendungen so funktioniert, wie es die Benutzer erwarten.

Übersicht

In den folgenden Abschnitten wird erklärt, wie die Legacyverschiebungsfunktion aktiviert wird:

  • Erstellen einer Anwendung mit Bildlaufleisten
  • Deaktivieren von Stiftbewegungen
  • Anpassen der Verschiebungsfunktion

Erstellen einer Anwendung mit Bildlaufleisten

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

Der Screenshot zeigt ein Fenster ohne Bildlaufleisten

Aktivieren Sie als Nächstes Bildlaufleisten auf dem Bild. Ändern Sie den Fenstererstellungscode in InitInstance so, dass durch den Aufruf der CreateWindow-Funktion ein Fenster mit Bildlaufleisten erstellt wird. Im folgenden Code wird die entsprechende Vorgehensweise gezeigt.


   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 die Anwendung über eine Bildlaufleiste. Die folgende Abbildung zeigt, wie die Anwendung zu diesem Zeitpunkt aussehen könnte.

Der Screenshot zeigt ein Fenster mit einer vertikalen Bildlaufleiste, aber ohne Text

Nachdem Sie den Fenstererstellungscode geändert haben, fügen Sie der Anwendung ein Bildlaufleistenobjekt und etwas Text für die Durchführung eines Bildlaufs hinzu. Fügen Sie den folgenden Code am Anfang der WndProc-Methode ein.


    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 danach die Anwendungslogik für die Konfiguration der Textberechnungen für Textmetriken. Der folgende Code sollte den vorhandenen Case-Abschnitt für WM_CREATE 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 Meldungsschalter 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 Meldungsschalter 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 danach den Code, um die Fensterdarstellung zu aktualisieren. Der folgende Code sollte den Case-Standardabschnitt für WM_PAINT in 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 Textbaustein und eine vertikale Bildlaufleiste aufweisen. Die folgende Abbildung zeigt, wie Ihre Anwendung aussehen könnte.

Der Screenshot zeigt ein Fenster mit einer vertikalen Bildlaufleiste und Text

Deaktivieren von Stiftbewegungen

Um die Verschiebungsfunktionalität in der Anwendung zu verbessern, sollten Sie Stiftbewegungen deaktivieren. Hierzu legen Sie Fenstereigenschaften für den hWnd-Wert fest, wenn er initialisiert wird. Die für Stiftbewegungen verwendeten Werte werden im tpcshrd.h-Header gespeichert, der ebenfalls einbezogen werden muss. Der folgende Code sollte in die Include-Direktiven und die InitInstance-Funktion eingefügt werden, nachdem Sie hWnd erstellt haben.


#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 Verschiebungsfunktion

Möglicherweise wünschen Sie eine andere Verschiebungsfunktionalität als die, die Windows 7 standardmäßig bietet. Um die Verschiebungsfunktionalität zu verbessern, müssen Sie den Handler für die WM_GESTURE-Meldung hinzufügen. Weitere Informationen finden Sie im Abschnitt Verbessern der Benutzerfreundlichkeit bei der Verschiebung mit einem Finger.

Verwandte Themen

Windows Touch-Gesten

 

 

Anzeigen: