IDirectManipulationManager
COM公式ドキュメント
クライアントアプリケーションが利用できる Direct Manipulation のすべての機能と API へのアクセスを提供します。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定したウィンドウで、入力の処理とコールバックの処理を行うために Direct Manipulation を有効化します。
| window | HWND | in | Direct Manipulation を有効化するウィンドウ。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
manipulation manager は既定では無効化されています。ウィンドウに対して Activate が呼び出されるまで、マネージャーは入力やコールバックを受け取ったり応答したりしません。
Activate と Deactivate の呼び出しは参照カウントされます。
例
次の例は、入力処理を有効化および無効化する方法を示しています。
LRESULT WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
BOOL handled = FALSE;
switch ( msg )
{
case WM_SIZE:
switch ( wParam)
{
case SIZE_MINIMIZED:
case SIZE_MAXHIDE:
pManipulationManager->Deactivate(hwnd);
break;
default:
pManipulationManager->Activate(hwnd);
break;
}
break;
}
if ( !handled)
{
return DefWindowProc(hwnd,msg,wParam,lParam);
}
else
{
return 0;
}
}
指定したウィンドウで、入力の処理とコールバックの処理を行う Direct Manipulation を無効化します。
| window | HWND | in | 入力を無効化するウィンドウ。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
manipulation manager は既定では無効化されています。Activate が呼び出されるまで、マネージャーは入力を受け取ったり応答したりしません。アプリが入力を受け取らない、または応答しない場合は、manipulation manager を無効化する必要があります。たとえば、アプリが最小化されているときです。
Activate と Deactivate の呼び出しは参照カウントされます。
ヒットテスト専用のスレッドを登録します。
| window | HWND | in | メインのアプリウィンドウのハンドル(通常は UI スレッドから作成されます)。 |
| hitTestWindow | HWND | inoptional | ヒットテストを登録するウィンドウのハンドル(ヒットテストスレッドから作成する必要があります)。以前に登録したヒットテストターゲットの登録を解除するには nullptr を渡します。 |
| type | DIRECTMANIPULATION_HITTEST_TYPE | in | DIRECTMANIPULATION_HITTEST_TYPE の値のいずれか。UI ウィンドウとヒットテストウィンドウのどちら(または両方)がヒットテストの WM_POINTERDOWN メッセージを受け取るか、およびその順序を指定します。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ヒットテストは通常、アプリケーションの UI スレッドで実行されます。アプリケーションは WM_POINTERDOWN メッセージを受け取り、それに対してヒットテストが実行されます。マニピュレーションが必要な場合は、1 つ以上のビューポートに対して SetContact が呼び出されます。アプリケーションは RegisterHitTestTarget メソッドを使用して、このヒットテストの処理を別のヒットテストスレッドに委譲できます。
専用のヒットテストターゲットが正常に登録されると、WM_POINTERDOWN メッセージはヒットテストスレッドで処理されます。パンやズームなどのマニピュレーションが必要な場合は、このスレッドから SetContact が呼び出されます。
ヒットテストスレッドから SetContact が呼び出されない場合、登録時に指定された DIRECTMANIPULATION_HITTEST_TYPE に応じて、WM_POINTERDOWN メッセージが UI スレッドで処理されることがあります。
ヒットテストスレッドと UI スレッドのどちらからも SetContact が呼び出されない場合、Direct Manipulation は入力を無視し、その入力は UI スレッドで処理されます。
アプリの UI スレッドで、キーボードおよびマウスのメッセージを manipulation manager に渡します。
| message | MSG* | in | 処理する入力メッセージ。 |
| handled | BOOL* | out | このメッセージに対してこれ以上処理を行わない場合は TRUE。それ以外の場合は FALSE。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
マウスおよびキーボードの入力に対してこのメソッドを呼び出します。
例
次の例は、manipulation manager にメッセージを渡す方法を示しています。
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL handled = FALSE;
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL handled = FALSE;
switch (msg)
{
case WM_KEYDOWN:
case WM_POINTERWHEEL:
case WM_POINTERHWHEEL:
case WM_MOUSEWHEEL:
case WM_MOUSEHWHEEL:
MSG msg = {};
msg.hwnd = hwnd;
msg.message = message;
msg.lParam = lParam;
msg.wParam = wParam;
if (FAILED(m_pManipulationManager->ProcessInput(&msg, &handled)))
{
handled = false;
}
break;
}
if ( !handled)
{
return DefWindowProc(hwnd,msg,wParam,lParam);
}
else
{
return 0;
}
}
コンポジターの更新を受け取る IDirectManipulationUpdateManager オブジェクトへのポインターを取得します。
| riid | GUID* | in | インターフェースの IID。 |
| object | void** | out | 新しい IDirectManipulationUpdateManager オブジェクトへのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
コンポジターが Direct Manipulation からの更新イベントに応答するには、初期化時に IDirectManipulationUpdateManager を IDirectManipulationCompositor オブジェクトに関連付ける必要があります。GetUpdateManager を使用して IDirectManipulationUpdateManager オブジェクトへのポインターを取得します。SetUpdateManager メソッドを使用して、このポインターをコンポジターに渡します。
新しい IDirectManipulationViewport オブジェクトを作成するために使用されるファクトリーメソッドです。
| frameInfo | IDirectManipulationFrameInfoProvider* | inoptional | ビューポートのフレーム情報プロバイダー。 |
| window | HWND | in | ビューポートに関連付けるメインのアプリウィンドウのハンドル。 |
| riid | GUID* | in | インターフェースの IID。 |
| object | void** | out | 新しい IDirectManipulationViewport オブジェクト。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ビューポート内にセカンダリコンテンツ(パンインジケーターなど)のインスタンスを作成するために使用されるファクトリーメソッドです。
| frameInfo | IDirectManipulationFrameInfoProvider* | inoptional | セカンダリコンテンツのフレーム情報プロバイダー。ビューポートの作成に使用したフレーム情報プロバイダーと一致する必要があります。 |
| clsid | GUID* | in | セカンダリコンテンツのクラス識別子(CLSID)。この ID はコンテンツの種類を指定します。 |
| riid | GUID* | in | インターフェースの IID。 |
| object | void** | out | 指定したインターフェースを実装するセカンダリコンテンツオブジェクト。 |
戻り値
メソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プライマリコンテンツはビューポートと同時に自動的に作成され、ビューポートと 1 対 1 の関係を持ちます。そのため、プライマリコンテンツを作成、追加、削除することはできません。
セカンダリコンテンツはビューポートとは独立して作成されます。ビューポートに追加または削除できるセカンダリコンテンツの数に制限はありません。すべてのセカンダリコンテンツの変換は、プライマリコンテンツがサポートする変換から派生し、要素の用途(クラス識別子(CLSID)で識別される)に基づいて特定のルールが適用されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirectManipulationManager "{FBF5D3B4-70C7-4163-9322-5A6F660D6FBC}" #usecom global IDirectManipulationManager IID_IDirectManipulationManager "{54E211B6-3650-4F75-8334-FA359598E1C5}" #comfunc global IDirectManipulationManager_Activate 3 sptr #comfunc global IDirectManipulationManager_Deactivate 4 sptr #comfunc global IDirectManipulationManager_RegisterHitTestTarget 5 sptr,sptr,int #comfunc global IDirectManipulationManager_ProcessInput 6 var,var #comfunc global IDirectManipulationManager_GetUpdateManager 7 var,sptr #comfunc global IDirectManipulationManager_CreateViewport 8 sptr,sptr,var,sptr #comfunc global IDirectManipulationManager_CreateContent 9 sptr,var,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDirectManipulationManager "{FBF5D3B4-70C7-4163-9322-5A6F660D6FBC}" #usecom global IDirectManipulationManager IID_IDirectManipulationManager "{54E211B6-3650-4F75-8334-FA359598E1C5}" #comfunc global IDirectManipulationManager_Activate 3 sptr #comfunc global IDirectManipulationManager_Deactivate 4 sptr #comfunc global IDirectManipulationManager_RegisterHitTestTarget 5 sptr,sptr,int #comfunc global IDirectManipulationManager_ProcessInput 6 sptr,sptr #comfunc global IDirectManipulationManager_GetUpdateManager 7 sptr,sptr #comfunc global IDirectManipulationManager_CreateViewport 8 sptr,sptr,sptr,sptr #comfunc global IDirectManipulationManager_CreateContent 9 sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。