IExtendContextMenu
COM公式ドキュメント
IExtendContextMenu インターフェイスを使用すると、スナップインは既存のコンテキストメニューに項目を追加できます。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IExtendContextMenu::AddMenuItems メソッドを使用すると、スナップインはコンテキストメニューに項目を追加できます。
| piDataObject | IDataObject* | in | 項目の追加先となるメニューのデータオブジェクト上の IDataObject インターフェイスへのポインター。 |
| piCallback | IContextMenuCallback* | in | コンテキストメニューに項目を追加できる IContextMenuCallback へのポインター。 |
| pInsertionAllowed | INT* | inout | 使用可能な MMC 定義のメニュー項目挿入ポイントを識別する値。次のフラグの組み合わせを指定できます。 CCM_INSERTIONALLOWED_TOPコンテキストメニューの先頭に項目を挿入できます。 CCM_INSERTIONALLOWED_NEW新規作成サブメニューに項目を挿入できます。 CCM_INSERTIONALLOWED_TASKすべてのタスクサブメニューに項目を挿入できます。 CCM_INSERTIONALLOWED_VIEWツールバーの表示メニュー、または結果ペインのコンテキストメニューの 表示 サブメニューに項目を挿入できます。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
解説(Remarks)
IExtendContextMenu::AddMenuItems の実装では、通常、piDataObject に対して IDataObject::GetDataHere を呼び出してノードの種類や必要なその他のパラメーターを読み取り、続いて piCallback に対して IContextMenuCallback::AddItem を呼び出して、適切なコンテキストメニュー項目を追加します。
MMC 定義の挿入ポイントにメニュー項目を追加しようとする前に、スナップインは pInsertionsAllowed フラグを調べて許可を確認する必要があります。たとえば、CCM_INSERTIONALLOWED_NEW フラグが設定されていない限り、スナップインは CCM_INSERTIONPOINTID_PRIMARY_NEW や CCM_INSERTIONPOINTID_3RDPARTY_NEW にメニュー項目を追加すべきではありません。
pInsertionsAllowed フラグによって、次の 2 つの機能が実現されます。
ユーザーがスコープ項目を選択してからそのコンテキストメニューを表示した場合、MMC はスナップインの IComponentData 実装と(現在のビューを所有する) IComponent 実装の両方にメニュー項目を追加する機会を与えます。MMC は、スナップインの IComponent 実装が実装する IExtendContextMenu::AddMenuItems メソッドを呼び出して、スナップインが 表示 メニューにメニュー項目を追加できるようにします。MMC は、スナップインの IComponentData が実装する IExtendContextMenu::AddMenuItems メソッドを呼び出して、スナップインがその他すべてのメニューにメニュー項目を追加できるようにします。 表示 メニューに項目を追加できるのは、スナップインの IComponent 実装だけです。
ユーザーがスコープ項目を選択せずにそのコンテキストメニューを表示した場合、MMC はスナップインの IComponentData 実装にのみ、 表示 メニューを除くすべてのメニューにメニュー項目を追加する機会を与えます。そのため、 表示 メニューは、ユーザーが最初に項目を選択した場合にのみスコープ項目に表示されます。
呼び出し元に関する注意事項
AddMenuItems メソッドは、piDataObject ポインターと piCallback ポインターのいずれに対しても AddRef を呼び出してはならず、また戻った後にこれらのインターフェイスのメソッドを呼び出してもいけません。代わりに、戻る前にこれらのインターフェイスのメソッドに対して必要なすべての呼び出しを行う必要があります。これらの項目のいずれかが選択された場合、 IExtendContextMenu::Command で IDataObject へのポインターが返されるため、このメソッドが戻った後にこのポインターを保持しないでください。いずれの項目も選択されずにメニューが閉じられた場合、通知は行われません。さらに、piCallback から別のインターフェイスを照会しないでください。IContextMenuCallback::AddItem という 1 つのメソッドで十分なはずです。
IExtendContextMenu::Command メソッドは、IExtendContextMenu::AddMenuItems でコンテキストメニューに追加した項目のいずれかが後で選択された場合に呼び出されます。
| lCommandID | INT | in | メニュー項目のコマンド識別子を指定する値。 |
| piDataObject | IDataObject* | in | コンテキストメニューが表示されたオブジェクト上の IDataObject インターフェイスへのポインター。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
解説(Remarks)
MMC は、スナップインの IExtendContextMenu::Command メソッドに送信する定義済みメニューコマンド ID 用として、負の値のコマンド ID を予約しています。コマンド ID の –1 は、mmc.h で定義されている MMCC_STANDARD_VIEW_SELECT 列挙値です。これは、ユーザーが 表示 メニューで標準ビューコマンド(大アイコン、小アイコン、一覧、または詳細)をクリックしたときに IExtendContextMenu::Command に送信されます。これは、ユーザーがカスタムビュー(OCX、HTML)から切り替えようとしていることをスナップインに通知します。MMCC_STANDARD_VIEW_SELECT コマンドを受け取った後、スナップインは次に IComponent::GetResultViewType メソッドが呼び出されたときに標準ビューを要求し、いずれかのカスタムビューメニュー項目が選択されるまでカスタムビューを要求しないようにする必要があります。スナップインが標準ビューのみ、またはカスタムビューのみを使用する場合は、MMCC_STANDARD_VIEW_SELECT コマンドを無視できます。
MMC は、ユーザーがツールバーの 戻る ボタンをクリックしたときに、スナップインに MMCC_STANDARD_VIEW_SELECT コマンドを送信します。MMC はこのコマンドを使用して、結果ペインの前のビューを表示するようスナップインに指示します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IExtendContextMenu "{4F3B7A4F-CFAC-11CF-B8E3-00C04FD8D5B0}" #usecom global IExtendContextMenu IID_IExtendContextMenu "{}" #comfunc global IExtendContextMenu_AddMenuItems 3 sptr,sptr,var #comfunc global IExtendContextMenu_Command 4 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IExtendContextMenu "{4F3B7A4F-CFAC-11CF-B8E3-00C04FD8D5B0}" #usecom global IExtendContextMenu IID_IExtendContextMenu "{}" #comfunc global IExtendContextMenu_AddMenuItems 3 sptr,sptr,sptr #comfunc global IExtendContextMenu_Command 4 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。