TN071: Mfc で IOleCommandTarget

IOleCommandTargetインターフェイスには、オブジェクトとコンテナーのそれぞれの他のコマンドをディスパッチすることができます。たとえば、オブジェクトのツールバー ボタン印刷印刷プレビュー保存新規作成、およびズームなどのコマンドを含めることができます。このようなオブジェクトは、 IOleCommandTargetをサポートするコンテナーに埋め込まれた場合は、オブジェクトがそのボタンを有効にして、ユーザーがクリックしたときの処理はコンテナーにコマンドを転送します。コンテナー自体を印刷するには、埋め込みオブジェクトと思ったら、それこの要求、埋め込みオブジェクトのIOleCommandTargetインターフェイスを介してコマンドを送信することによってことがあります。

IOleCommandTargetとオートメーションのようなインターフェイスは、クライアントがサーバー上のメソッドを呼び出すためです。ただし、 IOleCommandTargetを使用してプログラマは通常高価なのInvokeメソッドのIDispatchを使用する必要はありませんのでオートメーション インターフェイス経由での呼び出しのオーバーヘッドします。

MFC では、 IOleCommandTargetインターフェイス Active ドキュメント サーバーでコマンドをサーバーにディスパッチする Active ドキュメント コンテナーを許可する使用されます。Active ドキュメント サーバー クラス、 CDocObjectServerItem、MFC インターフェイス マップが使用されます (を参照してくださいTN038: MFC および OLE IUnknown の実装) IOleCommandTargetインターフェイスを実装するには。

IOleCommandTargetCOleFrameHookクラスで実装されています。COleFrameHookはインプレース編集コンテナーのフレーム ウィンドウの機能を実装する、ドキュメント化されていない MFC クラスです。COleFrameHookでは、また、MFC インターフェイス マップを使用してIOleCommandTargetインターフェイスを実装します。IOleCommandTargetCOleFrameHookの実装は、 COleDocObjectItemに OLE コマンドを転送-Active ドキュメント コンテナーを派生します。これは、MFC Active ドキュメント コンテナーでも含まれている Active ドキュメント サーバーからメッセージを受信することができます。

MFC OLE コマンド マップ

MFC 開発者IOleCommandTarget MFC OLE コマンド マップを使用して利用することができます。OLE コマンド コマンド マップを含むクラスのメンバー関数にマップに使用できるため、メッセージをマップのような OLE コマンド マップです。この作業を行うには、配置マクロ OLE コマンド グループを処理するコマンド、OLE コマンドのコマンド ID を指定するには、コマンド マップで、 OLE コマンドを受信すると、送信されるWM_COMMANDメッセージ。MFC は、標準 OLE コマンドの定義済みマクロの数をまた提供します。一覧については、標準的な OLE の最初ために設計されたコマンドが Microsoft Office アプリケーションで使用、docobj.h で定義されている OLECMDID の列挙体を参照してください。

OLE コマンドが OLE コマンド マップを含む MFC アプリケーションによって受信されると、MFC アプリケーションの OLE コマンド マップで要求されたコマンドのコマンド ID とコマンド グループを検索しようとします。一致が見つかった場合は、コマンド マップ、要求されたコマンドの id を含むアプリケーションにWM_COMMANDメッセージがディスパッチされます。( ON_OLECMD以下の説明を参照してください)。この方法では、MFC で、OLE コマンドをアプリケーションにディスパッチにWM_COMMANDメッセージになっています。WM_COMMANDメッセージ [MFC 標準を使用して、アプリケーションのメッセージ マップを通じてルーティングされる コマンド ルーティングアーキテクチャ。

メッセージ マップとは異なり、MFC OLE コマンド マップでは、ClassWizard ではサポートされていません。MFC 開発者 OLE コマンド マップのサポートと OLE コマンド マップ エントリを手動で追加する必要があります。OLE コマンド マップ MFC Active ドキュメント サーバーはWM_COMMANDメッセージ ルーティング チェーンの時に、アクティブなドキュメントの任意のクラスに追加することができますコンテナー内の場所でアクティブです。これらのクラスには、 CWinAppCView CDocument生成した COleIPFrameWndから派生した、アプリケーションのクラスが含まれます。Active ドキュメント コンテナーでは、OLE コマンド マップのみCOleDocObjectItemに追加することができます-クラスを派生します。また、Active ドキュメント コンテナーでは、 WM_COMMANDメッセージのみがメッセージ マップ、 COleDocObjectItemにディスパッチされます-派生クラス。

OLE コマンド マップ マクロ

次のマクロを使用してコマンド マップ機能をクラスに追加するには:

DECLARE_OLECMD_MAP ()

このマクロはクラス宣言のコマンド マップを含むクラスで (通常はヘッダー ファイル) です。

BEGIN_OLECMD_MAP ([クラス]、baseClass)

[クラス]

コマンド マップを含むクラスの名前。

baseClass

コマンド マップを含んでいるクラスの基本クラスの名前。

このマクロは、コマンド マップの先頭を示します。このマクロを使用してコマンド マップを含むクラスの実装ファイルで。

 END_OLECMD_MAP()

このマクロは、コマンド マップの最後を示します。このマクロは、コマンド マップを含むクラスの実装ファイルで使用します。このマクロを実行する必要があります常に、 BEGIN_OLECMD_MAP マクロ。

ON_OLECMD (pguid、olecmdid、id)

pguid

OLE コマンドのコマンド グループの GUID へのポインター。このパラメーターは、標準の OLE コマンド グループをNULLです。

olecmdid

OLE コマンドを起動するコマンドの ID。

id

この OLE コマンドが呼び出されたときに、コマンド マップを含んでいるアプリケーションに送信されるWM_COMMANDメッセージの ID。

使用して、 ON_OLECMD マクロで、OLE のエントリを追加するには、コマンド マップのコマンドを処理します。OLE コマンドが受信されると、彼らが、指定されたWM_COMMANDメッセージに変換され標準 MFC のコマンド ルーティングのアーキテクチャを使用して、アプリケーションのメッセージ マップを通じて転送。

OLE コマンドの処理機能を処理する MFC Active ドキュメント サーバーに追加する方法を次の例は、 OLECMDID_PRINT OLE コマンド。AppWizard は、Active ドキュメント サーバーで MFC アプリケーションを生成するために使用することの使用例します。

  1. あなたのCViewで-派生クラスのヘッダー ファイル、追加、 DECLARE_OLECMD_MAP マクロをクラス宣言。

    特価;CViewを使用-は、 WM_COMMANDメッセージ ルーティング チェーンでは、アクティブ ドキュメント サーバーのクラスの 1 つであるために、クラスを派生(&N)。

    cMyServerView クラス: パブリック CView{保護:/シリアル化からのみを作成CMyServerView();DECLARE_DYNCREATE(CMyServerView)DECLARE_OLECMD_MAP(). . .}
    
  2. Cview クラスの実装ファイルで-派生クラス、追加、 BEGIN_OLECMD_MAPEND_OLECMD_MAP マクロ:
    BEGIN_OLECMD_MAP (CMyServerView、CView)END_OLECMD_MAP()
    
  3. 標準的な OLE の印刷コマンドを処理するには、 ON_OLECMDマクロ標準印刷コマンドの OLE コマンド ID とID_FILE_PRINTWM_COMMAND ID の指定、コマンド マップに追加するにはID_FILE_PRINT AppWizard で生成された MFC アプリケーションで標準印刷コマンド ID です。:
    BEGIN_OLECMD_MAP (CMyServerView、CView)ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)END_OLECMD_MAP()
    

標準 OLE コマンド ID OLECMDID_PRINTであるため afxdocob.h では、定義された標準 OLE コマンド マクロの 1 つ、 ON_OLECMDマクロの代わりに使用できることに注意してください。ON_OLECMD_PRINTマクロ上記ON_OLECMDマクロと同じタスクを達成します。

コンテナー アプリケーションこのサーバー、サーバーのIOleCommandTargetインターフェイスを通じて、 OLECMDID_PRINTコマンドを送信すると、アプリケーションを印刷するには、サーバーがサーバーでは、MFC の印刷コマンド ハンドラーが呼び出されます。上記の手順で追加した印刷コマンドを呼び出す Active ドキュメント コンテナーのコードはこのようなものになります:

void CContainerCntrItem::DoOleCmd(){IOleCommandTarget ※ pCmd = NULL;Hr HRESULT E_FAIL; =OLECMD ocm = {0, OLECMDID_PRINT};hr = m_lpObject gt;QueryInterface (IID_IOleCommandTarget、reinterpret_cast < void 年 >(&pCmd));if(FAILED(hr))戻る;hr = pCmd - > QueryStatus NULL、1、(ocm、NULL);if(SUCCEEDED(hr) & & ocm.cmdf (OLECMDF_ENABLED)){//Command ができるのでそれを呼び出すCOleVariant vIn;COleVariant vOut;hr = pCmd - > Exec (NULL、OLECMDID_PRINT、OLECMDEXECOPT_DODEFAULT、& vIn と vOut);ASSERT(SUCCEEDED(hr));}pCmd - > Release();}

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index