共用方式為


TN071:MFC IOleCommandTarget 實作

注意事項注意事項

由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。

IOleCommandTarget介面可以讓物件和其容器分派彼此的命令。 比方說,物件的工具列可能會包含命令的按鈕時列印[預覽列印]儲存, New,以及。 如果這類物件內嵌在支援的容器IOleCommandTarget,無法啟用其中的按鈕物件,並將其轉送至容器的處理,使用者只要按一下這些指令。 如果容器不想內嵌的物件本身,使這個要求所傳送的命令,透過IOleCommandTarget的內嵌物件的介面。

IOleCommandTarget是一個類似自動化的介面,因為它正由用戶端叫用伺服器上的方法。 不過,使用IOleCommandTarget透過自動化介面進行呼叫,因為程式設計人員不需要使用通常是高度耗費資源的額外負荷會儲存Invoke方法的IDispatch

在 MFC 中, IOleCommandTarget介面的使用中文件的伺服器可用來允許主動式文件容器,分派到伺服器的命令。 使用中文件的伺服器類別, CDocObjectServerItem,使用 MFC 的介面對應 (請參閱 TN038: MFC/OLE IUnknown 實作) 來實作IOleCommandTarget介面。

IOleCommandTarget也實作在 COleFrameHook 類別。 COleFrameHook 未記載的 MFC 類別實作就地框架視窗功能正在編輯的容器。 COleFrameHook 也會使用 MFC 的介面對應來實作IOleCommandTarget介面。 COleFrameHook的實作IOleCommandTarget會轉送 OLE 命令給COleDocObjectItem-衍生主動式文件容器。 這可讓任何 MFC 使用中的文件容器接收來自被收納的使用中文件的伺服器訊息。

MFC OLE 命令對應

MFC 開發人員可以利用IOleCommandTarget使用 MFC OLE 命令對應。 OLE 命令對應 」 就像訊息對應,因為它們可以用來將 OLE 命令對應至包含命令對應的類別成員函式。 若要這麼做,巨集的命令對應,以指定您想要處理的命令、 OLE 命令,命令 ID 的 OLE 指令群組中放置 WM_COMMAND 收到 OLE 命令時要傳送的訊息。 MFC 也提供一些預先定義巨集,標準的 OLE 命令。 一份標準的 OLE 針對原先所設計的指令與 Microsoft Office 應用程式使用,請參閱 OLECMDID 列舉型別,定義在 docobj.h 中。

當包含 OLE 命令對應的 MFC 應用程式收到一個 OLE 命令時,MFC 會嘗試以尋找所要求的命令,OLE 命令對應的應用程式中的命令 ID 和命令群組中。 如果找到相符的項目, WM_COMMAND 被分派到包含所要求的命令 ID 的命令對應的應用程式。 (看的ON_OLECMD下面。)如此一來,派去摧毀應用程式的 OLE 指令轉換成 WM_COMMAND mfc 的訊息。 WM_COMMAND 的郵件會被傳送到使用標準的 MFC 應用程式的訊息對應命令傳送架構。

與不同的訊息對應,是不支援 MFC OLE 命令對應的類別精靈。 MFC 開發人員必須將 OLE 命令對應的支援和 OLE 命令對應的項目以手動方式。 OLE 命令對應可以加入至 MFC 使用中的文件伺服器中的任何類別中 WM_COMMAND 訊息路由的鏈結,在使用中文件是在容器內就地啟動的時間。 這些類別包括應用程式的類別衍生自 CWinAppCViewCDocument,以及 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 的指標。 這個參數是 NULL 標準的 OLE 指令群組。

  • olecmdid
    OLE 要叫用命令的命令 ID。

  • id
    識別碼為 WM_COMMAND 訊息傳送至這個 OLE 命令叫用時,包含命令對應的應用程式。

使用ON_OLECMD您想要處理的命令對應,ole 將項目中的巨集指令。 當接收到的 OLE 指令時,將轉換到指定 WM_COMMAND 訊息,並經由使用標準 MFC 命令傳送架構的應用程式的訊息對應。

範例

下列範例顯示如何將 OLE 命令處理功能加入至 MFC 使用中的文件伺服器來處理 OLECMDID_PRINT OLE 命令。 本範例假設使用 AppWizard 產生的 MFC 應用程式是在使用中文件伺服器。

  1. 在您CView-衍生類別的標頭檔案中加入DECLARE_OLECMD_MAP在類別宣告的巨集。

    注意事項注意事項

    使用CView-衍生類別,因為它是處於使用中的文件伺服器中的類別的 WM_COMMAND 訊息路由的鏈結。

    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 列印命令,將 ON_OLECMD 到指定的標準列印命令的 OLE 命令 ID 的命令對應的巨集和 ID_FILE_PRINTWM_COMMAND 編號]。 ID_FILE_PRINT 是 AppWizard 產生的 MFC 應用程式所使用的列印命令 ID 的標準:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
       ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

請注意其中一個標準 OLE 命令巨集,定義在 afxdocob.h,無法被取代的ON_OLECMD巨集因為 OLECMDID_PRINT 是一個標準的 OLE 命令 id。 ON_OLECMD_PRINT巨集將會完成相同的工作ON_OLECMD如上所示的巨集。

當一個容器應用程式會傳送這台伺服器 OLECMDID_PRINT 指令到伺服器的IOleCommandTarget介面,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();
}

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項