C# 範例中的 Windows Touch 手勢 (MTGesturesCS)
本節說明 C# 中的 Windows Touch 手勢範例。
此範例示範如何透過處理 WM_GESTURE 訊息,使用手勢訊息來平移、旋轉及縮放由圖形裝置介面 (GDI) 繪製的方塊。 下列螢幕快照顯示範例在執行時的外觀。
在此範例中,筆勢訊息會傳遞至手勢引擎,然後呼叫繪圖物件上的方法,以轉譯、旋轉及調整具有處理這些命令之方法的物件。 若要在 C# 中達成此情況,系統會建立特殊窗體 TouchableForm 來處理手勢訊息。 此窗體接著會使用訊息來變更繪圖物件 DrawingObject,以變更 Paint 方法中的對象呈現方式。
為了協助說明範例的運作方式,請考慮使用 pan 命令來平移渲染方塊的步驟。 用戶執行平移手勢,會產生包含筆勢識別碼GID_PAN的WM_GESTURE訊息。 TouchableForm 會處理此訊息並更新繪圖物件的位置,然後該物件會顯示其更新後的位置。
下列程式代碼示範手勢處理程式如何從 WM_GESTURE 訊息擷取參數,然後透過呼叫繪圖對象的移動方法,在轉譯方塊上執行轉譯。
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;
下列程式代碼顯示繪圖物件的移動方法如何更新內部位置變數。
public void Move(int deltaX,int deltaY)
{
_ptCenter.X += deltaX;
_ptCenter.Y += deltaY;
}
下列程式代碼示範如何在繪圖物件的繪製方法中使用位置。
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;
}
(...)
}
平移手勢會導致繪製方塊轉譯。