Sdílet prostřednictvím


TN071: MFC IOleCommandTarget – implementace

Poznámka

Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.

Rozhraní IOleCommandTarget umožňuje objektům a jejich kontejnerům vzájemně odesílat příkazy. Například panely nástrojů objektu můžou obsahovat tlačítka pro příkazy, jako Printjsou , Print Preview, Save, Newa Zoom. Pokud byl takový objekt vložen do kontejneru, který podporuje IOleCommandTarget, objekt by mohl povolit jeho tlačítka a předat příkazy ke zpracování do kontejneru, když na ně uživatel klikl. Pokud kontejner chtěl, aby se vložený objekt vytiskl sám, mohl by tento požadavek provést odesláním příkazu prostřednictvím IOleCommandTarget rozhraní vloženého objektu.

IOleCommandTarget je rozhraní podobné automatizaci, které používá klient k vyvolání metod na serveru. Použití však IOleCommandTarget šetří režijní náklady na volání prostřednictvím rozhraní Automation, protože programátoři nemusí používat obvykle nákladnou Invoke metodu IDispatch.

V prostředí MFC rozhraní používají servery aktivních dokumentů k tomu, IOleCommandTarget aby kontejnery aktivních dokumentů mohly odesílat příkazy na server. Třída CDocObjectServerItemserveru aktivního dokumentu používá mapy rozhraní MFC (viz TN038: MFC/OLE IUnknown Implementace) k implementaci IOleCommandTarget rozhraní.

IOleCommandTarget je také implementována COleFrameHook ve třídě. COleFrameHook je nezdokumentovaná třída MFC, která implementuje funkci okna rámečku místních kontejnerů pro úpravy. COleFrameHook také používá mapy rozhraní MFC k implementaci IOleCommandTarget rozhraní. COleFrameHookimplementace přeposílaných příkazů OLE do COleDocObjectItem-odvozených kontejnerů aktivních IOleCommandTarget dokumentů. To umožňuje libovolnému kontejneru aktivních dokumentů MFC přijímat zprávy z obsažených serverů dokumentů Active.

MAPY příkazů MFC OLE

Vývojáři MFC mohou využít IOleCommandTarget výhod pomocí map příkazů MFC OLE. Mapy příkazů OLE jsou podobné mapám zpráv, protože lze je použít k mapování příkazů OLE na členské funkce třídy, která obsahuje mapování příkazů. Aby to fungovalo, umístěte makra do mapy příkazů a určete skupinu příkazů OLE příkazu, který chcete zpracovat, příkaz OLE a ID příkazu WM_COMMAND zprávy, která se odešle při přijetí příkazu OLE. MFC také poskytuje několik předdefinovaných maker pro standardní příkazy OLE. Seznam standardních příkazů OLE, které byly původně navrženy pro použití s aplikacemi systém Microsoft Office, naleznete v výčtu OLECMDID, který je definován v docobj.h.

Když aplikace MFC, která obsahuje mapování příkazů OLE, obdrží příkaz OLE, pokusí se knihovna MFC najít ID příkazu a skupinu příkazů požadovaného příkazu v mapě příkazů OLE aplikace. Pokud se najde shoda, odešle se WM_COMMAND zpráva do aplikace obsahující mapu příkazů s ID požadovaného příkazu. (Viz popis ON_OLECMD níže.) Tímto způsobem jsou příkazy OLE odeslané do aplikace převedeny na WM_COMMAND zprávy mfc. WM_COMMAND zprávy se pak směrují prostřednictvím map zpráv aplikace pomocí standardní architektury směrování příkazů MFC.

Na rozdíl od map zpráv nejsou třídyWizard podporovány mapování příkazů MFC OLE. Vývojáři MFC musí přidat podporu mapování příkazů OLE a položky mapování příkazů OLE ručně. Mapování příkazů OLE lze přidat na servery dokumentů MFC Active ve všech třídách, které jsou v řetězu směrování zpráv WM_COMMAND v době, kdy je aktivní aktivní v kontejneru. Mezi tyto třídy patří třídy aplikace odvozené z CWinApp, CView, CDocument a COleIPFrameWnd. V kontejnerech aktivních dokumentů lze mapy příkazů OLE přidat pouze do COleDocObjectItem-odvozené třídy. V kontejnerech aktivních dokumentů se také zprávy WM_COMMAND odešlou pouze do mapy zpráv v COleDocObjectItemodvozené třídě.

Makra mapování příkazů OLE

Pomocí následujících maker přidejte do třídy funkci mapování příkazů:

DECLARE_OLECMD_MAP ()

Toto makro se používá v deklaraci třídy (obvykle v souboru hlavičky) třídy, která obsahuje mapování příkazů.

BEGIN_OLECMD_MAP(theClass, baseClass)

theClass
Název třídy, která obsahuje mapování příkazů.

Baseclass
Název základní třídy třídy, která obsahuje mapu příkazů.

Toto makro označuje začátek mapy příkazů. Toto makro použijte v souboru implementace pro třídu, která obsahuje mapování příkazů.

END_OLECMD_MAP()

Toto makro označuje konec mapy příkazů. Toto makro použijte v souboru implementace pro třídu, která obsahuje mapování příkazů. Toto makro musí vždy následovat za BEGIN_OLECMD_MAP makrem.

ON_OLECMD(pguid, olecmdid, id)

pguid
Ukazatel na identifikátor GUID skupiny příkazů OLE. Tento parametr má hodnotu NULL pro standardní skupinu příkazů OLE.

olecmdid
ID příkazu OLE, který se má vyvolat.

id
ID WM_COMMAND zprávy, která se má odeslat do aplikace obsahující mapování příkazů při vyvolání tohoto příkazu OLE.

Pomocí ON_OLECMD makra v mapě příkazů přidejte položky pro příkazy OLE, které chcete zpracovat. Při přijetí příkazů OLE se převedou na zadanou zprávu WM_COMMAND a směrují se přes mapu zpráv aplikace pomocí standardní architektury směrování příkazů MFC.

Příklad

Následující příklad ukazuje, jak přidat schopnost zpracování příkazů OLE na server dokumentů MFC Active Document Server pro zpracování OLECMDID_PRINT OLE příkaz. Tento příklad předpokládá, že jste použili AppWizard k vygenerování aplikace MFC, která je serverem aktivního dokumentu.

  1. CViewDo souboru hlavičky třídy -odvozené třídy přidejte do deklarace třídy makro DECLARE_OLECMD_MAP.

    Poznámka

    CViewPoužijte -odvozenou třídu, protože je jednou z tříd na serveru aktivního dokumentu, který je v 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()
        // . . .
    };
    
  2. Do souboru implementace pro CView-odvozenou třídu přidejte BEGIN_OLECMD_MAP a END_OLECMD_MAP makra:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Chcete-li zpracovat standardní příkaz OLE print, přidejte do mapy příkazů ON_OLECMD makro, které určuje ID příkazu OLE pro standardní příkaz tisku a ID_FILE_PRINT pro id WM_COMMAND. ID_FILE_PRINT je standardní ID příkazu tisku používané aplikacemi MFC generované aplikací AppWizard:

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

Všimněte si, že jedno ze standardních maker příkazů OLE definované v afxdocob.h lze použít místo ON_OLECMD makra, protože OLECMDID_PRINT je standardní ID příkazu OLE. Makro ON_OLECMD_PRINT provede stejnou úlohu jako ON_OLECMD makro uvedené výše.

Když aplikace kontejneru odešle tento server OLECMDID_PRINT příkaz prostřednictvím rozhraní serveru IOleCommandTarget , vyvolá se obslužná rutina tiskového příkazu MFC na serveru, což způsobí, že server vytiskne aplikaci. Kód kontejneru aktivního dokumentu pro vyvolání příkazu print přidaného v předchozích krocích by vypadal 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();
}

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií