Udostępnij za pośrednictwem


TN071: Wdrożenie IOleCommandTarget MFC

[!UWAGA]

Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.

IOleCommandTarget Interfejs umożliwia obiektów i ich pojemniki do wysyłania poleceń do siebie.Na przykład paski narzędzi obiektu może zawierać przyciski poleceń takich jak wydruku, Podgląd wydruku, zapisać, New, i Powiększenie.Jeśli taki obiekt zostały osadzone w pojemniku, który obsługuje IOleCommandTarget, umożliwiającą jej przycisków i poleceń do kontenera do przetwarzania, gdy użytkownik kliknie je przekazywać obiekt.Jeśli kontener obiektu osadzonego do samego drukowania, może upewnij to żądanie, wysyłając polecenia przez IOleCommandTarget interfejsu obiektu osadzonego.

IOleCommandTargetInterfejs automatyzacji jak należy się, że jest używany przez klienta do wywołania metody na serwerze.Jednakże, za pomocą IOleCommandTarget zapisuje obciążenie związane z ustanawianiem połączeń za pośrednictwem interfejsów automatyzacji, ponieważ programistów nie zazwyczaj drogie Invoke metoda IDispatch.

W MFC IOleCommandTarget interfejsu jest używany przez serwery aktywnego dokumentu, aby umożliwić kontenerów aktywnego dokumentu do wysyłania poleceń do serwera.Klasa serwera aktywnego dokumentu, CDocObjectServerItem, wykorzystuje mapy interfejsu MFC (zobacz TN038: wykonania IUnknown MFC/OLE) do wdrożenia IOleCommandTarget interfejsu.

IOleCommandTargetjest również implementowana w COleFrameHook klasy.COleFrameHook nieudokumentowanych klasy MFC, który implementuje funkcje okna ramki w miejsce edytuje pojemników.COleFrameHook używa również MFC interfejsu mapy do wdrożenia IOleCommandTarget interfejsu.COleFrameHookw realizacji IOleCommandTarget przekazuje polecenia OLE COleDocObjectItem-uzyskane kontenerów aktywnego dokumentu.Dzięki temu MFC Active kontenera dokumentu odbierać wiadomości z serwerów zamkniętego aktywnego dokumentu.

Mapy polecenia OLE MFC

MFC deweloperzy mogą korzystać z IOleCommandTarget za pomocą MFC OLE polecenia map.OLE polecenia map są takie jak mapy wiadomości, ponieważ mogą być używane do mapowania poleceń OLE do klasy, która zawiera mapę polecenia funkcji.To działało, należy umieścić na mapie polecenia do określenia grupy polecenia OLE polecenia ma obsługiwać, polecenie OLE i identyfikator polecenia z makra WM_COMMAND komunikat, który zostanie wysłane po odebraniu polecenia OLE.MFC również przewiduje szereg wstępnie zdefiniowanych makra standardowe polecenia OLE.Listę standard OLE poleceń, które pierwotnie zostały zaprojektowane dla korzystać z aplikacji pakietu Microsoft Office, zobacz wyliczenie OLECMDID, który jest zdefiniowany w docobj.h.

Po odebraniu polecenia OLE, aplikacja MFC, zawierający mapę polecenia OLE MFC próbuje znaleźć identyfikator polecenia i polecenie grupy dla żądanego polecenia w mapie polecenia OLE aplikacji.Jeśli zostanie znaleziona, WM_COMMAND wiadomości jest wysyłane do aplikacji, zawierający mapę polecenia z Identyfikatorem żądanego polecenia.(Zobacz opis ON_OLECMD poniżej.) W ten sposób OLE polecenia wysyłane do aplikacji są włączone do WM_COMMAND wiadomości przez MFC.WM_COMMAND wiadomości są następnie routowane przez mapy komunikat aplikacji przy użyciu standardu MFC polecenia routingu architektury.

W przeciwieństwie do mapy wiadomości mapy MFC OLE polecenia nie są obsługiwane przez ClassWizard.Deweloperzy MFC należy dodać ręcznie obsługa mapę polecenia OLE i wpisy map polecenia OLE.OLE mapy polecenia mogą być dodawane do MFC aktywnych serwerów dokumentu w dowolnej klasy, która jest w WM_COMMAND łańcucha routingu wiadomości w momencie aktywny dokument jest aktywny w miejsce w pojemniku.Klasy te obejmują aplikacji klasy pochodzące od CWinApp, CView, CDocument, i COleIPFrameWnd.W pojemnikach aktywnego dokumentu OLE polecenia map mogą być dodawane tylko do COleDocObjectItem-klasy.Ponadto w pojemnikach aktywnego dokumentu WM_COMMAND wiadomości będą wysyłane jedynie do mapy wiadomości w COleDocObjectItem-klasy.

Makra mapę polecenia OLE

Aby dodać funkcji mapę poleceń do swojej klasy, należy użyć następujące makra:

DECLARE_OLECMD_MAP ()

To makro przechodzi w deklaracji klasy (zwykle w pliku nagłówka) klasa, która zawiera mapę polecenia.

BEGIN_OLECMD_MAP(theClass, baseClass)
  • theClass
    Nazwa klasy, która zawiera mapę polecenia.

  • baseClass
    Nazwa klasy bazowej klasy, która zawiera mapę polecenia.

To makro oznacza początek mapę polecenia.Użyj tego makra w pliku implementacji dla klasy, która zawiera mapę polecenia.

END_OLECMD_MAP()

To makro oznacza koniec mapę polecenia.Użyj tego makra w pliku implementacji dla klasy, która zawiera mapę polecenia.To makro należy zawsze wykonać BEGIN_OLECMD_MAP makro.

ON_OLECMD(pguid, olecmdid, id)
  • pguid
    Wskaźnik na identyfikator GUID grupy poleceń polecenie OLE.Ten parametr jest NULL dla grupy standardowe polecenia OLE.

  • olecmdid
    Identyfikator polecenia do wywołania polecenia OLE.

  • id
    Identyfikator WM_COMMAND komunikat do wysłania do aplikacji, zawierających mapy polecenia, jeżeli to polecenie OLE jest wywoływany.

Użyj ON_OLECMD makro w mapę polecenia, aby dodać wpisy dla OLE polecenia chcesz obsługiwać.Po odebraniu polecenia OLE, zostaną one przekonwertowane na określony WM_COMMAND wiadomości i kierowane przez mapę komunikat aplikacji przy użyciu standardowych architekturę routingu polecenia MFC.

Przykład

Poniższy przykład pokazuje, jak dodać funkcję obsługi polecenia OLE do MFC Active server dokumentu do obsługi OLECMDID_PRINT polecenia OLE.W przykładzie założono używane AppWizard do generowania aplikacji MFC serwer aktywnego dokumentu.

  1. W sieci CView-uzyskane nagłówek klasy plików, dodawanie DECLARE_OLECMD_MAP makro w deklaracji klasy.

    [!UWAGA]

    Użyj CView-uzyskane klasy, ponieważ jest to jedna z klas w serwera aktywnego dokumentu, który jest w WM_COMMAND łańcucha routingu wiadomości.

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. W pliku implementacji dla CView-klasy, dodać BEGIN_OLECMD_MAP i END_OLECMD_MAP makr:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Do obsługi standardowych poleceń drukowania OLE, należy dodać ON_OLECMD makro do mapy polecenia, określając identyfikator polecenia OLE dla standardowych poleceń drukowania i ID_FILE_PRINT do WM_COMMAND identyfikatora.ID_FILE_PRINT jest standardowym identyfikator polecenia drukowania używane przez aplikacje MFC generowane AppWizard:

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

Należy zauważyć, że jeden standardowy makra polecenia OLE zdefiniowane w afxdocob.h, mogą być stosowane zamiast ON_OLECMD makro ponieważ OLECMDID_PRINT jest standardowy identyfikator polecenia OLE.ON_OLECMD_PRINT Makro będzie wykonać to samo zadanie ON_OLECMD makro pokazanym powyżej.

Gdy aplikacja kontenera wysyła ten serwer OLECMDID_PRINT poleceń za pomocą serwera IOleCommandTarget interfejsu, MFC, polecenie obsługi drukowania zostanie wywołany na serwerze, powodując serwera drukowania z aplikacji.Kod pojemnika aktywnego dokumentu do wywołania polecenia print w powyższych kroków dodaje będzie wyglądać następująco:

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();
}

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii