TN071: Provádění IOleCommandTarget MFC
[!POZNÁMKA]
Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
IOleCommandTarget Rozhraní umožňuje objektů a jejich obaly k odeslání příkazů navzájem.Například objektu panely nástrojů mohou obsahovat tlačítka pro příkazy jako Tisk, Náhled, Uložit, New, a zvětšení.Pokud se takový objekt byly vloženy v kontejneru, který podporuje IOleCommandTarget, objekt nelze povolit jeho tlačítek a předávat příkazy do kontejneru po klepnutí uživatele na jejich zpracování.Pokud kontejner vložený objekt samotný tisk, stanovisek tuto žádost zasláním příkazu prostřednictvím IOleCommandTarget rozhraní vložený objekt.
IOleCommandTargetrozhraní automatizace Podobně se, že klient je používán k vyvolání metod na serveru.Však pomocí IOleCommandTarget uloží režii vytváření volání prostřednictvím rozhraní automatizace, protože nemusíte použít obvykle levnější programátoři Invoke metody IDispatch.
V MFC IOleCommandTarget rozhraní umožňují servery v aktivním dokumentu aktivní dokument nádoby k odeslání příkazů serveru.Třídy dokumentu Active server CDocObjectServerItem, používá mapování rozhraní MFC (viz TN038: implementace MFC/OLE IUnknown) k provedení IOleCommandTarget rozhraní.
IOleCommandTargetje také implementována COleFrameHook třídy.COleFrameHook nezdokumentovaný třídy MFC, která implementuje funkci okno rámeček v místě úpravy kontejnerů.COleFrameHook mapy rozhraní MFC používá také implementovat IOleCommandTarget rozhraní.COleFrameHookna provádění IOleCommandTarget předává příkazy OLE COleDocObjectItem-odvozené kontejnery aktivního dokumentu.To umožňuje MFC aktivní dokument kontejneru, přijímat zprávy od serverů uzavřeného aktivního dokumentu.
MFC OLE příkaz map
MFC vývojáři využít IOleCommandTarget pomocí MFC OLE příkazu map.Příkaz map OLE jsou jako zpráva mapuje, protože lze použít k mapování OLE příkazy funkce členů třídy, která obsahuje příkaz map.Chcete-li tuto práci, umístit do mapy příkaz určit skupinu OLE příkaz příkaz, který chcete zpracovat, příkaz OLE a ID příkazu makra WM_COMMAND zprávy, která bude odeslána při doručení příkazu OLE.MFC také poskytuje několik předdefinovaných makra pro standardní příkazy OLE.Seznam standardních OLE příkazy, které byly původně navrženy pro použití s aplikací Microsoft Office naleznete v tématu OLECMDID výčtu, který je definován v docobj.h.
Po přijetí příkazu OLE aplikace MFC obsahující mapování příkaz OLE MFC pokusí najít ID příkazu a skupiny příkazů pro požadovaný příkaz v příkazu Mapa OLE aplikace.Pokud je nalezena shoda, WM_COMMAND zpráva je odeslána do aplikace obsahující příkaz map s ID požadovaný příkaz.(Viz popis ON_OLECMD pod.) Tímto způsobem jsou zapnuty OLE příkazy odesílají do aplikace do WM_COMMAND zprávy podle MFC.WM_COMMAND zprávy směrovány pomocí mapování aplikace zpráv pomocí standardu MFC pak příkaz směrování architektury.
Na rozdíl od zprávy mapy mapy příkaz MFC OLE nepodporuje ClassWizard.MFC vývojáři musí ručně přidat příkaz map podpory a záznamů map příkaz OLE.OLE příkaz map lze přidat servery MFC aktivní dokument do třídy, která je WM_COMMAND řetězu směrování zpráv v době aktivního dokumentu je aktivní v místě v kontejneru.Tyto třídy zahrnují aplikace třídy odvozené z CWinApp, CView, CDocument, a COleIPFrameWnd.V nádobách aktivního dokumentu příkaz map OLE lze přidat pouze k COleDocObjectItem-odvozené třídy.Také v nádobách aktivního dokumentu WM_COMMAND zprávy bude odeslán pouze mapy zprávy v COleDocObjectItem-odvozené třídy.
OLE příkaz Map maker
Přidat příkaz funkce mapy do třídy použijte následující makra:
DECLARE_OLECMD_MAP ()
Toto makro přechází v deklaraci třídy (obvykle v záhlaví souboru) třídy, která obsahuje příkaz map.
BEGIN_OLECMD_MAP(theClass, baseClass)
theClass
Název třídy, která obsahuje příkaz map.baseClass
Název základní třídy třídy, která obsahuje příkaz map.
Toto makro označuje začátek příkazu map.Použijte toto makro v souboru implementace třídy, která obsahuje příkaz map.
END_OLECMD_MAP()
Toto makro označuje konec příkazu map.Použijte toto makro v souboru implementace třídy, která obsahuje příkaz map.Toto makro musí vždy následovat BEGIN_OLECMD_MAP makro.
ON_OLECMD(pguid, olecmdid, id)
pguid
Ukazatel na identifikátor GUID skupiny příkazů příkazu OLE.Tento parametr je NULL pro standardní skupiny příkazů OLE.olecmdid
ID příkazu OLE vyvolat příkaz.id
ID WM_COMMAND zprávy zasílané do aplikace obsahující příkaz map při příkaz OLE.
Použití ON_OLECMD makro v mapě příkaz Přidat položky pro OLE příkazy chcete zpracovat.Jakmile jsou přijaty příkazy OLE, převedou se na zadaný WM_COMMAND zprávy a směrovány přes mapu aplikace zprávy pomocí standardní architekturu směrování příkaz MFC.
Příklad
Následující příklad ukazuje, jak přidat příkaz zpracování funkce OLE serveru MFC aktivní dokument zpracovat OLECMDID_PRINT příkaz OLE.Tento příklad předpokládá, použít AppWizard ke generování MFC aplikace, která je server aktivního dokumentu.
Ve vaší CView-záhlaví třídy odvozené soubor, přidejte DECLARE_OLECMD_MAP makro deklaraci třídy.
[!POZNÁMKA]
Použití CView-protože jedné třídy v server aktivního dokumentu v odvozené třídy WM_COMMAND řetězu směrování zpráv.
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
Provádění souboru CView-odvozené třídy, přidat BEGIN_OLECMD_MAP a END_OLECMD_MAP makra:
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
Zpracování standardní OLE tiskový příkaz Přidat ON_OLECMD mapy příkaz zadání ID příkazu OLE pro standardní tiskový příkaz Makro a ID_FILE_PRINT pro WM_COMMAND ID.ID_FILE_PRINT je standardní ID příkazu print používá MFC AppWizard generované aplikací:
BEGIN_OLECMD_MAP(CMyServerView, CView) ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT) END_OLECMD_MAP()
Jeden standardní příkaz makra OLE definovaná v afxdocob.h, nelze použít místo ON_OLECMD makro protože OLECMDID_PRINT je standardní ID příkazu OLE.ON_OLECMD_PRINT Makro bude možné provést stejný úkol jako ON_OLECMD makro výše.
Když aplikace kontejneru odešle tento server OLECMDID_PRINT na server pomocí příkazu IOleCommandTarget rozhraní MFC popisovač příkazu Tisk bude vyvolána na serveru způsobuje server k tisku aplikace.Aktivní dokument kontejneru kód k vyvolání příkazu print přidali výše uvedené kroky by vypadat přibližně takto:
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();
}