TN071:MFC IOleCommandTarget 實作
注意
下列技術提示自其納入線上文件以來,未曾更新。 因此,有些程序和主題可能已過期或不正確。 如需最新資訊,建議您在線上文件索引中搜尋相關的主題。
介面 IOleCommandTarget
可讓物件及其容器彼此分派命令。 例如,物件的工具列可能包含 、、 Print Preview
、 New
Save
和 Zoom
等 Print
命令的按鈕。 如果這類物件內嵌在支援的 IOleCommandTarget
容器中,物件可以啟用其按鈕,並在使用者按下命令時將命令轉送至容器進行處理。 如果容器想要内嵌物件自行列印,它可以透過 IOleCommandTarget
内嵌物件的介面傳送命令來提出此要求。
IOleCommandTarget
是類似自動化的介面,用戶端會用來在伺服器上叫用方法。 不過,使用 IOleCommandTarget
可節省透過自動化介面進行呼叫的額外負荷,因為程式設計人員不需要使用 通常昂貴的 Invoke
方法 IDispatch
。
在 MFC 中 IOleCommandTarget
,Active 檔案伺服器會使用 介面,以允許使用中檔容器將命令分派至伺服器。 Active Document Server 類別 CDocObjectServerItem
會使用 MFC 介面對應(請參閱 TN038:MFC/OLE IUnknown 實作 )來實 IOleCommandTarget
作 介面。
IOleCommandTarget
也會在 類別中實作 COleFrameHook
。 COleFrameHook
是一個未記載的 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 應用程式。
CView
在衍生類別的標頭檔中,將DECLARE_OLECMD_MAP宏新增至類別宣告。注意
CView
使用 衍生類別,因為它是使用中檔案伺服器中WM_COMMAND訊息路由鏈結中的其中一個類別。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 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();
}