C # 範例中的 Windows Touch 手勢 (MTGesturesCS)

本節說明 c # 中的 Windows Touch 手勢範例。

此 Windows Touch 手勢範例示範如何使用手勢訊息,藉由處理 WM_GESTURE 訊息,來轉譯、旋轉和調整圖形裝置介面 (GDI) 所轉譯的方塊。 下列螢幕擷取畫面顯示範例在執行時的外觀。

螢幕擷取畫面,顯示 c 中的 windows 觸控手勢(當其正在執行時),並在畫面上以黑色空心矩形為中心

在此範例中,會將手勢訊息傳遞至手勢引擎,然後呼叫繪圖物件上的方法,以轉譯、旋轉和縮放具有處理這些命令之方法的物件。 若要在 c # 中這麼做,會建立特殊形式 TouchableForm 來處理手勢訊息。 然後,此表單會使用訊息來變更繪圖物件(DrawingObject),以變更物件在油漆方法中的呈現方式。

若要協助示範範例的運作方式,請考慮使用平移命令轉譯轉譯方塊的步驟。 使用者執行平移手勢,此動作會產生具有手勢識別碼 GID_PAN 的 WM_GESTURE 訊息。 TouchableForm 會處理此訊息並更新繪圖物件的位置,然後物件會轉譯成本身的轉譯。

下列程式碼示範軌跡處理常式如何從 WM_GESTURE 訊息抓取參數,然後透過呼叫繪圖物件的 move 方法,在轉譯的方塊上執行轉譯。

            switch (gi.dwID)
            {
                case GID_BEGIN:
                case GID_END:
                    break;
               (...)
                case GID_PAN:
                    switch (gi.dwFlags)
                    {
                        case GF_BEGIN:
                            _ptFirst.X = gi.ptsLocation.x;
                            _ptFirst.Y = gi.ptsLocation.y;
                            _ptFirst = PointToClient(_ptFirst);
                            break;

                        default:
                            // We read the second point of this gesture. It is a
                            // middle point between fingers in this new position
                            _ptSecond.X = gi.ptsLocation.x;
                            _ptSecond.Y = gi.ptsLocation.y;
                            _ptSecond = PointToClient(_ptSecond);

                            // We apply move operation of the object
                            _dwo.Move(_ptSecond.X - _ptFirst.X, _ptSecond.Y - _ptFirst.Y);

                            Invalidate();

                            // We have to copy second point into first one to
                            // prepare for the next step of this gesture.
                            _ptFirst = _ptSecond;
                            break;
                    }
                    break;

下列程式碼顯示繪圖物件的 move 方法如何更新內部位置變數。

        public void Move(int deltaX,int deltaY)
        {
            _ptCenter.X += deltaX;
            _ptCenter.Y += deltaY;
        }

下列程式碼顯示如何在繪圖物件的 paint 方法中使用位置。

public void Paint(Graphics graphics)
        {
(...)
            for (int j = 0; j < 5; j++)
            {
                int idx = arrPts[j].X;
                int idy = arrPts[j].Y;

                // rotation
                arrPts[j].X = (int)(idx * dCos + idy * dSin);
                arrPts[j].Y = (int)(idy * dCos - idx * dSin);

                // translation
                arrPts[j].X += _ptCenter.X;
                arrPts[j].Y += _ptCenter.Y;
            }
(...)
        }

平移手勢將會轉譯已轉譯的繪圖方塊。

多點觸控手勢應用程式 (c # ) 多點觸控手勢應用程式 (c + +) Windows Touch 範例