Windows Touch Scratchpad-Beispiel (C++)

Das Windows Touch Scratchpad-Beispiel zeigt, wie Windows Touch-Nachrichten verwendet werden, um Ablaufverfolgungen der Touchpunkte in ein Fenster zu zeichnen. Die Spur des primären Fingers, der zuerst auf den Digitalisierer gelegt wurde, wird schwarz gezeichnet. Sekundäre Finger werden in sechs anderen Farben gezeichnet: Rot, Grün, Blau, Cyan, Magenta und Gelb. Die folgende Abbildung zeigt, wie die Anwendung während der Ausführung aussehen könnte.

Screenshot des Windows-Touch-Scratchpads mit roten und schwarzen Wellenlinien auf dem Bildschirm

Für diese Anwendung wird das Fenster als Touchfenster registriert, Touchnachrichten werden interpretiert, um Touchpunkte zu Strichobjekten hinzuzufügen, und Freihandstriche werden auf dem Bildschirm im WM_PAINT-Nachrichtenhandler gerendert.

Der folgende Code zeigt, wie das Fenster als Touchfenster registriert wird.

    // Register application window for receiving multitouch input. Use default settings.
    if(!RegisterTouchWindow(hWnd, 0))
    {
        MessageBox(hWnd, L"Cannot register application window for multitouch input", L"Error", MB_OK);
        return FALSE;
    }

Der folgende Code zeigt, wie Touchnachrichten verwendet werden, um Touchpunkte zu Freihandstrichen hinzuzufügen.

        // WM_TOUCH message handlers
        case WM_TOUCH:
            {
                // WM_TOUCH message can contain several messages from different contacts
                // packed together.
                // Message parameters need to be decoded:
                unsigned int numInputs = (unsigned int) wParam; // Number of actual per-contact messages
                TOUCHINPUT* ti = new TOUCHINPUT[numInputs]; // Allocate the storage for the parameters of the per-contact messages
                if(ti == NULL)
                {
                    break;
                }
                // Unpack message parameters into the array of TOUCHINPUT structures, each
                // representing a message for one single contact.
                if(GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT)))
                {
                    // For each contact, dispatch the message to the appropriate message
                    // handler.
                    for(unsigned int i=0; i<numInputs; ++i)
                    {
                        if(ti[i].dwFlags & TOUCHEVENTF_DOWN)
                        {
                            OnTouchDownHandler(hWnd, ti[i]);
                        }
                        else if(ti[i].dwFlags & TOUCHEVENTF_MOVE)
                        {
                            OnTouchMoveHandler(hWnd, ti[i]);
                        }
                        else if(ti[i].dwFlags & TOUCHEVENTF_UP)
                        {
                            OnTouchUpHandler(hWnd, ti[i]);
                        }
                    }
                }
                CloseTouchInputHandle((HTOUCHINPUT)lParam);
                delete [] ti;
            }
            break;

Der folgende Code zeigt, wie die Freihandstriche im WM_PAINT Meldungshandler auf den Bildschirm gezeichnet werden.

        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // Full redraw: draw complete collection of finished strokes and
            // also all the strokes that are currently in drawing.
            g_StrkColFinished.Draw(hdc);
            g_StrkColDrawing.Draw(hdc);
            EndPaint(hWnd, &ps);
            break;

Der folgende Code zeigt, wie das Strichobjekt Striche auf dem Bildschirm rendert.

void CStroke::Draw(HDC hDC) const
{
    if(m_nCount < 2)
    {
        return;
    }

    HPEN hPen = CreatePen(PS_SOLID, 3, m_clr);
    HGDIOBJ hOldPen = SelectObject(hDC, hPen);
    Polyline(hDC, m_arrData, m_nCount);
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
}

Windows Touch Scratchpad-Beispiel (C#),Multitouch Scratchpad-Anwendung (WM_TOUCH/C#),Multitouch Scratchpad-Anwendung (WM_TOUCH/C++),Windows-Touch-Beispiele