テクニカル ノート 71: MFC IOleCommandTarget の実装
[!メモ]
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
IOleCommandTarget インターフェイスはオブジェクトを有効にし、ディスパッチへのコンテナーは相互にコマンド。たとえば、オブジェクトの 印刷ツールバーは、 印刷プレビュー、 上書き保存(&&S),保存(&&S),上書き保存,保存,保存しますか、 Newと ズームのようなコマンドのボタンを含める場合があります。このようなオブジェクトが IOleCommandTargetをサポートするコンテナーに埋め込まれている場合、オブジェクトはボタンを有効にし、ユーザーがコントロールをクリックしたか処理するためのコンテナーにコマンドをコピーできます。コンテナーが埋め込まれたオブジェクトに自身を印刷する場合は、埋め込みオブジェクトの IOleCommandTarget インターフェイスを通じてコマンドを送信することで、この要求ができます。
IOleCommandTarget はサーバーのメソッドを呼び出すことをクライアントに使用されているオートメーションに似たインターフェイスです。ただし、 IOleCommandTarget を使用してプログラムが IDispatchの Invoke の通常のメソッドを使用する必要がないため、オートメーション インターフェイスによって呼び出しの作成のオーバーヘッドを保存します。
では、 MFC IOleCommandTarget インターフェイスを使用できるようにするためにアクティブ ドキュメント サーバーにアクティブ ドキュメント コンテナー ディスパッチ コマンドにサーバー。アクティブ ドキュメント サーバー クラス、 CDocObjectServerItemの使用の MFC インターフェイス ( TN038: MFC/OLE IUnknown の実装を参照) IOleCommandTarget インターフェイスを実装するにマップします。
IOleCommandTarget は、 COleFrameHook のクラスに実装されます。COleFrameHook は埋め込み先編集コンテナーのフレーム ウィンドウの機能を実装する記載されていない MFC クラスです。COleFrameHook は、 IOleCommandTarget インターフェイスを実装するために MFC インターフェイス マップを使用します。COleFrameHook の COleDocObjectItemへの順方向の IOleCommandTarget の OLE コマンド派生アクティブ ドキュメント コンテナーの実装。これは、 MFC のアクティブ ドキュメント コンテナーが含まれるアクティブ ドキュメント サーバーからメッセージを受信できるようにします。
MFC OLE コマンド マップ
MFC の開発者は、 MFC OLE コマンド マップを使用して IOleCommandTarget を利用できます。OLE コマンド マップは、メッセージ マップなどのコマンド マップを含むクラスのメンバー関数に OLE コマンドをマップするために使用できるためです。コマンド マップの作業、場所のマクロ OLE コマンドとコマンド ID を、処理するコマンドの OLE コマンド グループを指定するために、 OLE コマンドを受信したときに送信 WM_COMMAND のメッセージにする場合は。MFC は、標準 OLE コマンドにいくつかの定義済みマクロを提供します。Microsoft Office アプリケーションで使用するためにデザインされている標準 OLE コマンドの一覧については、 docobj.h で定義されている OLECMDID の列挙を参照してください。
OLE コマンドが OLE コマンド マップを含む MFC アプリケーションが受信すると、 MFC はアプリケーションの OLE コマンド マップの要求されたコマンドのコマンド ID、およびコマンド グループを検索します。一致がある場合、 WM_COMMAND のメッセージは、要求されたコマンドのコマンド ID のマッピングを含むアプリケーションにディスパッチされます。(次 ON_OLECMD の説明を参照してください。このように、アプリケーションにディスパッチ、 OLE コマンドは、 MFC によって WM_COMMAND のメッセージになります。WM_COMMAND のメッセージは、 MFC の標準 コマンド ルーティング アーキテクチャを使用してアプリケーションのメッセージ マップを通じて、ルーティングされます。
メッセージ マップとは異なり、 MFC OLE コマンド マップは ClassWizard でサポートされません。MFC の開発者は、 OLE コマンド マップ サポートと OLE コマンド マップ エントリを手動で追加する必要があります。OLE コマンド マップは、当時、アクティブ ドキュメントによって、コンテナーの埋め込み先編集である WM_COMMAND のメッセージ ルーティングのチェーンにあるクラスの MFC アクティブ ドキュメント サーバーに追加できます。これらのクラスは CWinApp、 CView、 CDocumentと COleIPFrameWndから派生したアプリケーションのクラスが含まれています。アクティブ ドキュメント コンテナーでは、 OLE コマンド マップは COleDocObjectItem派生クラスにのみ追加できます。また、アクティブ ドキュメント コンテナーで、 WM_COMMAND のメッセージが COleDocObjectItemのメッセージ マップの派生クラスだけにディスパッチされます。
OLE コマンド マップ マクロ
クラスは、コマンド マップの機能を追加するには、次のマクロの使用:
DECLARE_OLECMD_MAP ()
このマクロは、コマンド マップを含むクラスのクラス宣言 (通常、ヘッダー ファイル)になります。
BEGIN_OLECMD_MAP(theClass, baseClass)
theClass
コマンド マップを含んでいるクラスの名前。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。
、処理する OLE コマンドのエントリを追加するには、コマンドにマップ ON_OLECMD のマクロを使用します。OLE コマンドを受け取った場合、 WM_COMMAND の指定されたメッセージに変換され、アプリケーションのメッセージ マップを通じて標準 MFC のコマンド ルーティング アーキテクチャを使用してパスを指定します。
使用例
次の例に OLECMDID_PRINT の OLE コマンドを処理するように MFC のアクティブ ドキュメント サーバーに OLE のコマンド処理機能を追加する方法を示します。この例は、アクティブ ドキュメント サーバーである MFC アプリケーションを作成するには、 AppWizard を使用したことを前提としています。
CView派生クラスのヘッダー ファイルはクラス宣言に、 DECLARE_OLECMD_MAP のマクロを追加します。
[!メモ]
CView- WM_COMMAND のメッセージ ルーティングのチェーンにあるアクティブ ドキュメント サーバーのクラスの 1 であるため、派生クラスを使用します。
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
CViewの実装ファイル派生クラスは、 BEGIN_OLECMD_MAP と END_OLECMD_MAP のマクロを追加します:
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
標準 OLE 印刷コマンドを処理するには、標準印刷コマンドで OLE コマンド ID と WM_COMMAND ID に ID_FILE_PRINT を指定するコマンドにマップ ON_OLECMD のマクロを追加します。ID_FILE_PRINT は、 AppWizard 生成された MFC アプリケーションで使用される標準印刷コマンドの ID です:
BEGIN_OLECMD_MAP(CMyServerView, CView) ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT) END_OLECMD_MAP()
OLECMDID_PRINT が標準 OLE コマンド ID であるため、標準 OLE コマンド マクロの場合に、 afxdocob.h で定義されていることに注意してください ON_OLECMD マクロの代わりに使用できますON_OLECMD_PRINT のマクロは、上記の ON_OLECMD マクロと同じタスクを実行します。
コンテナー アプリケーションがサーバーの IOleCommandTarget インターフェイスを使用してこのサーバーに OLECMDID_PRINT コマンドを送信するとき、 MFC の印刷コマンド ハンドラーは、アプリケーションを印刷するサーバーと、に呼び出されます。前の手順で追加した印刷コマンドを呼び出すアクティブ ドキュメント コンテナーのコードは次のようになります。:
void CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget *pCmd = NULL;
HRESULT hr = E_FAIL;
OLECMD ocm={OLECMDID_PRINT, 0};
hr = m_lpObject->QueryInterface(IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
if(FAILED(hr))
return;
hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
if(SUCCEEDED(hr) && (ocm.cmdf & OLECMDF_ENABLED))
{
//Command is available and enabled so call it
COleVariant vIn;
COleVariant vOut;
hr = pCmd->Exec(NULL, OLECMDID_PRINT,
OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
ASSERT(SUCCEEDED(hr));
}
pCmd->Release();
}