次の方法で共有


テクニカル ノート 71: MFC IOleCommandTarget の実装

[!メモ]

次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。

IOleCommandTarget インターフェイスはオブジェクトを有効にし、ディスパッチへのコンテナーは相互にコマンド。たとえば、オブジェクトの 印刷ツールバーは、 印刷プレビュー上書き保存(&&S),保存(&&S),上書き保存,保存,保存しますか、 Newと ズームのようなコマンドのボタンを含める場合があります。このようなオブジェクトが IOleCommandTargetをサポートするコンテナーに埋め込まれている場合、オブジェクトはボタンを有効にし、ユーザーがコントロールをクリックしたか処理するためのコンテナーにコマンドをコピーできます。コンテナーが埋め込まれたオブジェクトに自身を印刷する場合は、埋め込みオブジェクトの IOleCommandTarget インターフェイスを通じてコマンドを送信することで、この要求ができます。

IOleCommandTarget はサーバーのメソッドを呼び出すことをクライアントに使用されているオートメーションに似たインターフェイスです。ただし、 IOleCommandTarget を使用してプログラムが IDispatchInvoke の通常のメソッドを使用する必要がないため、オートメーション インターフェイスによって呼び出しの作成のオーバーヘッドを保存します。

では、 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 アクティブ ドキュメント サーバーに追加できます。これらのクラスは CWinAppCViewCDocumentCOleIPFrameWndから派生したアプリケーションのクラスが含まれています。アクティブ ドキュメント コンテナーでは、 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 を使用したことを前提としています。

  1. CView派生クラスのヘッダー ファイルはクラス宣言に、 DECLARE_OLECMD_MAP のマクロを追加します。

    [!メモ]

    CView- WM_COMMAND のメッセージ ルーティングのチェーンにあるアクティブ ドキュメント サーバーのクラスの 1 であるため、派生クラスを使用します。

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. CViewの実装ファイル派生クラスは、 BEGIN_OLECMD_MAP と END_OLECMD_MAP のマクロを追加します:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. 標準 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();
}

参照

その他の技術情報

番号順テクニカル ノート

カテゴリ別テクニカル ノート