共用方式為


TN071:MFC IOleCommandTarget 實作

注意

下列技術提示自其納入線上文件以來,未曾更新。 因此,有些程序和主題可能已過期或不正確。 如需最新資訊,建議您在線上文件索引中搜尋相關的主題。

介面 IOleCommandTarget 可讓物件及其容器彼此分派命令。 例如,物件的工具列可能包含 、、 Print PreviewNew SaveZoomPrint 命令的按鈕。 如果這類物件內嵌在支援的 IOleCommandTarget 容器中,物件可以啟用其按鈕,並在使用者按下命令時將命令轉送至容器進行處理。 如果容器想要内嵌物件自行列印,它可以透過 IOleCommandTarget 内嵌物件的介面傳送命令來提出此要求。

IOleCommandTarget 是類似自動化的介面,用戶端會用來在伺服器上叫用方法。 不過,使用 IOleCommandTarget 可節省透過自動化介面進行呼叫的額外負荷,因為程式設計人員不需要使用 通常昂貴的 Invoke 方法 IDispatch

在 MFC 中 IOleCommandTarget ,Active 檔案伺服器會使用 介面,以允許使用中檔容器將命令分派至伺服器。 Active Document Server 類別 CDocObjectServerItem 會使用 MFC 介面對應(請參閱 TN038:MFC/OLE IUnknown 實作 )來實 IOleCommandTarget 作 介面。

IOleCommandTarget 也會在 類別中實作 COleFrameHookCOleFrameHook 是一個未記載的 MFC 類別,可實作就地編輯容器的框架視窗功能。 COleFrameHook 也會使用 MFC 介面對應來實作 IOleCommandTarget 介面。 COleFrameHook的 實作 IOleCommandTarget 會將 OLE 命令轉送至 COleDocObjectItem 衍生的作用中檔容器。 這可讓任何 MFC Active 檔容器接收來自自主使用中檔案伺服器的訊息。

MFC OLE 命令地圖

MFC 開發人員可以使用 MFC OLE 命令對應來利用 IOleCommandTarget 。 OLE 命令對應就像訊息對應,因為它們可用來將 OLE 命令對應至包含命令對應之類別的成員函式。 若要讓這項工作,請將宏放在命令對應中,以指定您要處理的命令 OLE 命令群組、OLE 命令,以及接收 OLE 命令時所傳送之WM_COMMAND 訊息的命令 識別碼。 MFC 也提供一些標準 OLE 命令的預先定義宏。 如需原本設計來搭配 Microsoft Office 應用程式lications 使用的標準 OLE 命令清單,請參閱 docobj.h 中定義的 OLECMDID 列舉。

當包含 OLE 命令對應的 MFC 應用程式收到 OLE 命令時,MFC 會嘗試在應用程式的 OLE 命令對應中,尋找所要求命令的命令識別碼和命令群組。 如果找到相符專案,則會將WM_COMMAND訊息分派至包含命令對應且具有所要求命令識別碼的應用程式。 (請參閱下面的描述 ON_OLECMD 。如此一來,MFC 會將分派至應用程式的 OLE 命令轉換成WM_COMMAND訊息。 接著,WM_COMMAND訊息會使用 MFC 標準 命令路由架構,透過應用程式的訊息對應進行路由 傳送。

不同于訊息對應,ClassWizard 不支援 MFC OLE 命令對應。 MFC 開發人員必須手動新增 OLE 命令對應支援和 OLE 命令對應專案。 OLE 命令對應可以在使用中檔在容器中就地使用中時,任何類別中的WM_COMMAND訊息路由鏈結中,新增至 MFC Active 檔案伺服器。 這些類別包括衍生自 CWinApp 、CView CDocument COleIPFrameWnd 的應用程式類別。 在使用中檔容器中,OLE 命令對應只能新增至 COleDocObjectItem 衍生類別。 此外,在 Active 檔容器中,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
叫用這個 OLE 命令時,要傳送至包含命令對應之應用程式的WM_COMMAND訊息識別碼。

使用命令對應中的 ON_OLECMD 宏,為您想要處理的 OLE 命令新增專案。 收到 OLE 命令時,它們會轉換成指定的WM_COMMAND訊息,並使用標準 MFC 命令路由架構透過應用程式的訊息對應進行路由傳送。

範例

下列範例示範如何將 OLE 命令處理功能新增至 MFC Active 檔案伺服器,以處理 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 print 命令,請將ON_OLECMD宏新增 至命令對應,以指定標準列印命令的 OLE 命令識別碼,並為 WM_COMMAND識別碼指定ID_FILE_PRINT ID_FILE_PRINT 是 AppWizard 產生的 MFC 應用程式所使用的標準列印命令識別碼:

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

請注意,afxdocob.h 中定義的其中一個標準 OLE 命令宏可用來取代ON_OLECMD宏,因為 OLECMDID_PRINT 是標準 OLE 命令識別碼。 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();
}

另請參閱

依編號顯示的技術提示
依分類區分的技術提示