Win32 API 日本語リファレンス
ホームUI.Input.Touch › _IManipulationEvents

_IManipulationEvents

COM
IID4f62c8da-9c53-4b22-93df-927a862bbb03継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

操作(マニピュレーション)および慣性のイベントを処理します。

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT ManipulationStarted(FLOAT x, FLOAT y)

操作(マニピュレーション)または慣性が開始したときのイベントを処理します。

xFLOATinユーザー定義座標における原点の x 座標。
yFLOATinユーザー定義座標における原点の y 座標。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。

解説(Remarks)

操作イベントは、IInertiaProcessor インターフェイスと IManipulationProcessor インターフェイスの両方に対して生成されます。 TOUCHINPUT 構造体の値を ProcessDown の呼び出しで使用している場合、座標の単位は 100 分の 1 ピクセルになります。

次のコードは、ManipulationStarted メソッドの実装例を示しています。


HRESULT STDMETHODCALLTYPE CManipulationEventSink::ManipulationStarted( 
    /* [in] */ FLOAT x,
    /* [in] */ FLOAT y)
{
    m_cStartedEventCount ++;

    // place your code handler here to do any operations based on the manipulation

    return S_OK;
}
    
    
vtbl 4 HRESULT ManipulationDelta(FLOAT x, FLOAT y, FLOAT translationDeltaX, FLOAT translationDeltaY, FLOAT scaleDelta, FLOAT expansionDelta, FLOAT rotationDelta, FLOAT cumulativeTranslationX, FLOAT cumulativeTranslationY, FLOAT cumulativeScale, FLOAT cumulativeExpansion, FLOAT cumulativeRotation)

操作対象のオブジェクトが変化したときに発生するイベントを処理します。

xFLOATinユーザー定義座標における原点の x 座標。
yFLOATinユーザー定義座標における原点の y 座標。
translationDeltaXFLOATin前回のイベント以降の、x 軸方向への平行移動の変化量(ユーザー定義座標)。
translationDeltaYFLOATin前回のイベント以降の、y 軸方向への平行移動の変化量(ユーザー定義座標)。
scaleDeltaFLOATin前回のイベント以降のスケールの変化量。前回のスケールに対する割合(パーセント)で表されます。
expansionDeltaFLOATin前回のイベント以降の拡張の変化量(ユーザー定義座標)。
rotationDeltaFLOATin前回のイベント以降の回転の変化量(ラジアン)。
cumulativeTranslationXFLOATin操作の開始以降の、x 軸方向への平行移動量(ユーザー定義座標)。
cumulativeTranslationYFLOATin操作の開始以降の、y 軸方向への平行移動量(ユーザー定義座標)。
cumulativeScaleFLOATin操作の開始以降のスケールの変化量。元のサイズに対する割合(パーセント)で表されます。
cumulativeExpansionFLOATin操作の開始以降の拡張の変化量(ユーザー定義座標)。
cumulativeRotationFLOATin操作の開始以降の回転の変化量(ラジアン)。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。

解説(Remarks)

操作イベントは、IInertiaProcessor インターフェイスと IManipulationProcessor インターフェイスの両方に対して生成されます。 TOUCHINPUT 構造体の値を ProcessMove の呼び出しで使用している場合、座標の単位は 100 分の 1 ピクセルになります。

メモ 慣性を使用する場合、IInertiaProcessor::Complete の呼び出しによって現在の操作が外挿(補外)され、その結果として大きなデルタ値が ManipulationCompleted イベントに渡されることがあります。 この問題に対処するには、デルタイベントに加えて完了イベントでも更新を行ってください。

次のコードは、ManipulationDelta メソッドの実装例を示しています。

HRESULT STDMETHODCALLTYPE CManipulationEventSink::ManipulationDelta( 
    /* [in] */ FLOAT x,
    /* [in] */ FLOAT y,
    /* [in] */ FLOAT translationDeltaX,
    /* [in] */ FLOAT translationDeltaY,
    /* [in] */ FLOAT scaleDelta,
    /* [in] */ FLOAT expansionDelta,
    /* [in] */ FLOAT rotationDelta,
    /* [in] */ FLOAT cumulativeTranslationX,
    /* [in] */ FLOAT cumulativeTranslationY,
    /* [in] */ FLOAT cumulativeScale,
    /* [in] */ FLOAT cumulativeExpansion,
    /* [in] */ FLOAT cumulativeRotation)
{
    m_cDeltaEventCount ++;

    // Place your code handler here to do any operations based on the manipulation.

    return S_OK;
}    
    
vtbl 5 HRESULT ManipulationCompleted(FLOAT x, FLOAT y, FLOAT cumulativeTranslationX, FLOAT cumulativeTranslationY, FLOAT cumulativeScale, FLOAT cumulativeExpansion, FLOAT cumulativeRotation)

操作(マニピュレーション)または慣性が終了したときのイベントを処理します。

xFLOATinユーザー定義座標における原点の x 座標。
yFLOATinユーザー定義座標における原点の y 座標。
cumulativeTranslationXFLOATin操作の開始以降の、x 軸方向への合計平行移動量(ユーザー定義座標)。
cumulativeTranslationYFLOATin操作の開始以降の、y 軸方向への合計平行移動量(ユーザー定義座標)。
cumulativeScaleFLOATin操作の開始以降のスケールの合計変化量。元のサイズに対する割合(パーセント)で表されます。
cumulativeExpansionFLOATin操作の開始以降の拡張の合計変化量(ユーザー定義座標)。
cumulativeRotationFLOATin操作の開始以降の回転の合計変化量(ラジアン)。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。

解説(Remarks)

操作イベントは、IInertiaProcessor インターフェイスと IManipulationProcessor インターフェイスの両方に対して生成されます。 TOUCHINPUT 構造体の値を ProcessUp の呼び出しで使用している場合、座標の単位は 100 分の 1 ピクセルになります。

メモ 慣性を使用する場合、IInertiaProcessor::Complete の呼び出しによって現在の操作が外挿(補外)され、その結果として大きなデルタ値が ManipulationCompleted イベントに渡されることがあります。 この問題に対処するには、デルタイベントに加えて完了イベントでも更新を行ってください。

次のコードは、ManipulationCompleted メソッドの実装例を示しています。




HRESULT STDMETHODCALLTYPE CManipulationEventSink::ManipulationCompleted( 
    /* [in] */ FLOAT x,
    /* [in] */ FLOAT y,
    /* [in] */ FLOAT cumulativeTranslationX,
    /* [in] */ FLOAT cumulativeTranslationY,
    /* [in] */ FLOAT cumulativeScale,
    /* [in] */ FLOAT cumulativeExpansion,
    /* [in] */ FLOAT cumulativeRotation)
{
    m_cCompletedEventCount ++;

    m_fX = x;
    m_fY = y;
    m_fCumulativeTranslationX = cumulativeTranslationX;
    m_fCumulativeTranslationY = cumulativeTranslationY;
    m_fCumulativeScale = cumulativeScale;
    m_fCumulativeExpansion = cumulativeExpansion;
    m_fCumulativeRotation = cumulativeRotation;

    // Place your code handler here to do any operations based on the manipulation.

    return S_OK;
}
    
    
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID__IManipulationEvents "{4F62C8DA-9C53-4B22-93DF-927A862BBB03}"
#usecom global _IManipulationEvents IID__IManipulationEvents "{}"
#comfunc global _IManipulationEvents_ManipulationStarted    3 float,float
#comfunc global _IManipulationEvents_ManipulationDelta      4 float,float,float,float,float,float,float,float,float,float,float,float
#comfunc global _IManipulationEvents_ManipulationCompleted  5 float,float,float,float,float,float,float
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。