다음을 통해 공유


Windows Touch 스크래치 패드 샘플(C++)

Windows Touch Scratchpad 샘플 Windows Touch 메시지를 사용하여 터치 지점의 추적을 창에 그리는 방법을 보여 줍니다. 디지타이저에 먼저 놓인 주 손가락의 흔적은 검은색으로 그려집니다. 보조 손가락은 빨강, 녹색, 파랑, 시안색, 자홍색 및 노란색의 여섯 가지 다른 색으로 그려집니다. 다음 이미지는 실행하는 동안 애플리케이션이 어떻게 보일 수 있는지 보여줍니다.

빨간색과 검은색 물결선이 있는 창 터치 스크래치 패드를 보여주는 화면 스크린샷 .

이 애플리케이션의 경우 창이 터치 창으로 등록되고, 터치 메시지는 스트로크 개체에 터치 포인트를 추가하도록 해석되고, 잉크 스트로크는 WM_PAINT 메시지 처리기의 화면에 렌더링됩니다.

다음 코드에서는 창이 터치 창으로 등록되는 방법을 보여 줍니다.

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

다음 코드에서는 터치 메시지를 사용하여 잉크 스트로크에 터치 포인트를 추가하는 방법을 보여 줍니다.

        // 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;

다음 코드에서는 WM_PAINT 메시지 처리기에서 잉크 스트로크를 화면에 그리는 방법을 보여 줍니다.

        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;

다음 코드에서는 스트로크 개체가 화면에 스트로크를 렌더링하는 방법을 보여 줍니다.

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 터치 스크래치패드 샘플(C#), 다중 터치 스크래치패드 애플리케이션(WM_TOUCH/C#), 다중 터치 스크래치패드 애플리케이션(WM_TOUCH/C++), Windows 터치 샘플