Sdílet prostřednictvím


TN071: MFC IOleCommandTarget – implementace

[!POZNÁMKA]

Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

IOleCommandTarget Rozhraní umožňuje objekty a jejich obaly k odeslání příkazů k sobě navzájem.Například objektu panely nástrojů mohou obsahovat tlačítka pro příkazy jako Tisk, Náhled, Uložit, New, a Lupa.Pokud takový objekt byly vloženy do kontejneru, který podporuje IOleCommandTarget, by mohl povolit jeho tlačítka a předávat příkazy ke kontejneru pro zpracování, jakmile uživatel kliknul, je objekt.Pokud kontejner vložený objekt samotný tisk, ji můžete provést tento požadavek odeslání příkazu prostřednictvím IOleCommandTarget rozhraní vloženého objektu.

IOleCommandTargetrozhraní automatizace jako je v tom, že klient je používán k vyvolání metody na serveru.Však pomocí IOleCommandTarget uloží režii volání prostřednictvím rozhraní automatizace protože programátoři nemají používat obvykle nákladné Invoke metoda IDispatch.

V knihovně MFC IOleCommandTarget rozhraní umožňují servery aktivního dokumentu kontejnery aktivní dokument odeslat příkazy na server.Třídy server aktivního dokumentu, CDocObjectServerItem, používá knihovna MFC rozhraní mapy (viz TN038: implementaci IUnknown MFC/OLE) provádět IOleCommandTarget rozhraní.

IOleCommandTargetje také implementována COleFrameHook třídy.COleFrameHook nezdokumentovaný třídy knihovny MFC, která implementuje funkce okna rámečku v místě úpravy obalů.COleFrameHook také používá mapování rozhraní knihovny MFC pro implementaci IOleCommandTarget rozhraní.COleFrameHookna provádění IOleCommandTarget předává příkazy OLE COleDocObjectItem-odvozené kontejnery aktivního dokumentu.To umožňuje libovolný kontejner služby MFC Active dokumentu pro příjem zpráv ze serverů kontejneru aktivního dokumentu.

MFC OLE příkaz map

Vývojáři knihovny MFC lze využít IOleCommandTarget MFC OLE použijete příkaz map.Příkaz map OLE jsou podobné mapy zpráv, protože slouží k mapování příkazů OLE členské funkce třídy, která obsahuje příkaz map.Chcete-li tato práce, umístěte do mapování příkazu zadat příkaz, který chcete zpracovat, OLE příkazu a příkazu ID skupiny příkazů OLE makra WM_COMMAND zpráva, která bude odeslána při přijetí příkazu OLE.Knihovna MFC poskytuje také řadu předdefinovaných makra pro standardní příkazy OLE.Seznam standardní OLE příkazy, které byly původně navrženy pro použití s aplikacemi Microsoft Office naleznete v tématu výčet OLECMDID, která je definována v docobj.h.

Jakmile obdrží příkaz OLE aplikace knihovny MFC, která obsahuje mapování příkazu OLE, se pokouší o nalezení ID příkazu a příkazu skupiny pro požadovaný příkaz příkaz mapy OLE aplikace knihovny MFC.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 převedena OLE příkazy odeslány do aplikace WM_COMMAND zprávy pomocí knihovny MFC.WM_COMMAND zprávy směrovány poté mapování zpráv aplikace pomocí standardní knihovna MFC příkaz směrování architektury.

Na rozdíl od zprávy mapy map příkaz knihovny MFC OLE nejsou podporovány ClassWizard.MFC musí vývojáři přidat podporu mapa příkaz OLE a OLE příkaz mapovat položky ručně.OLE příkaz map mohou být přidány do knihovny MFC aktivními servery dokumentu jakákoliv třída, která je v WM_COMMAND řetěz 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 dokumentem OLE příkaz map lze přidat pouze k COleDocObjectItem-odvozené třídy.Také v nádobách aktivního dokumentu WM_COMMAND zprávy bude odeslána pouze k mapu zpráv v COleDocObjectItem-odvozené třídy.

OLE příkaz Map maker

Příkaz mapovat funkce přidat do vaší třídy pomocí následující makra:

DECLARE_OLECMD_MAP ()

Toto makro přechází v deklaraci třídy (obvykle v souboru hlaviček) 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 pro třídu, která obsahuje příkaz map.

Toto makro označuje začátek příkazu map.Použítí toto makra v souboru implementace třídy, která obsahuje příkaz map.

END_OLECMD_MAP()

Toto makro označí konec příkazu map.Použítí toto makra v souboru implementace třídy, která obsahuje příkaz map.Toto makro musí vždy následovat BEGIN_OLECMD_MAP makra.

ON_OLECMD(pguid, olecmdid, id)
  • pguid
    Ukazatel na identifikátor GUID skupiny příkazů příkazu OLE.Tento parametr je NULL pro standardní OLE skupiny příkazů.

  • olecmdid
    ID příkazu OLE pomocí příkazu vyvolat.

  • id
    ID WM_COMMAND zprávy zasílané do aplikace obsahující mapování příkazu při vyvolání příkaz OLE.

Použití ON_OLECMD makro v mapě příkaz Přidat položky OLE příkazy chcete zpracovat.Pokud jsou přijaty příkazy OLE, budou převedeny na zadaný WM_COMMAND zpráva a směrovány přes mapu zpráv aplikace pomocí standardního MFC architekturu směrování příkazu.

Příklad

Následující příklad ukazuje, jak přidat schopnost zpracování příkazu OLE serveru MFC aktivní dokument zpracovat OLECMDID_PRINT příkaz OLE.Tento příklad předpokládá použít AppWizard ke generování aplikace knihovny MFC, která je server aktivního dokumentu.

  1. Ve své CView-odvozené třídy záhlaví souboru, přidejte DECLARE_OLECMD_MAP makro k deklaraci třídy.

    [!POZNÁMKA]

    Použití CView-odvozené třídy, protože se jedná o jednu ze tříd v server aktivního dokumentu, který je v WM_COMMAND řetěz směrování zpráv.

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. Do implementačního souboru pro CView-odvozené třídy, přidejte BEGIN_OLECMD_MAP a END_OLECMD_MAP makra:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Zpracovat příkaz pro tisk standardní OLE, přidat ON_OLECMD makro mapování příkazu zadáním ID příkazu OLE pro standardní příkaz pro tisk a ID_FILE_PRINT pro WM_COMMAND ID.ID_FILE_PRINT je standard, který používá ID příkazu print aplikací generované AppWizard MFC:

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

Všimněte si, že jeden standardní příkaz makra OLE podle afxdocob.h, lze použít místo ON_OLECMD makro protože OLECMDID_PRINT je standardní ID příkazu OLE.ON_OLECMD_PRINT Makro bude provádět stejné úkoly, jako ON_OLECMD makro výše uvedenou.

Když aplikace kontejneru, odešle tento server OLECMDID_PRINT příkazu prostřednictvím serveru IOleCommandTarget bude vyvolána rozhraní MFC obslužná rutina příkazů pro tisk na serveru způsobuje server pro tisk aplikaci.Kód kontejneru aktivního dokumentu k vyvolání příkazu print přidána do 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();
}

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií